Фронтен / Бекенд И Язык Для Модуля

Доброго времени, хочу поделиться своим соображением насчет очередного способа разделения приложения на юзер и админ части. Суть состоит в том, чтоб приложение во время запроса могло определить к какой части осуществляеться запрос.

Итак наш клас HttpRequest




class HttpRequest extends CHttpRequest

{

	private $_pathInfo;

	private $_language;

	private $_appEnd;

	

	public function getPathInfo()

	{	

		if($this->_pathInfo===null)

		{

			$pathInfo = parent::getPathInfo();

                        

                        //разбиваем pathInfo в масив, нам нужна только первая часть

			$parts = explode('/', $pathInfo);

			

			if(isset($parts[0]))

			{

                                // здесь проверяем соответствие первого сегмента языку приложения

                                // из Yii::app()->params['app_languages']

				if(in_array($parts[0], params('app_languages')) and $parts[0]!=params('defaultLanguage'))

				{

					$this->_appEnd='frontend';

					$this->_language=$parts[0];

					unset($parts[0]);

					$pathInfo = implode($parts, '/');

				}


                                // если $parts[0] не язык, то в таком случаи ето может бить наш путь в админку

				elseif($parts[0]==params('app_backend_url'))

				{

					$this->_appEnd = 'backend';

					$this->_language=params('app_language');

					unset($parts[0]);                              //извлекаем параметр из $pathInfo

					$pathInfo = implode($parts, '/');

				}

			}

                        // по дефолту ставим фронтенд и язык по умолчанию

			else

			{

				$this->_appEnd='frontend';

				$this->_language=params('app_language');

			}

			$this->_pathInfo = $pathInfo;

		}

		return $this->_pathInfo;

	}


	public function getLanguage()    // геттер для языка приложения

	{

		if($this->_language)

			return $this->_language;

		$this->getPathInfo();

		return $this->_language;

	}

	

	public function getAppEnd()    // геттер для текущего аппенда

	{

		if($this->_appEnd)

			return $this->_appEnd;

		$this->getPathInfo();

		return $this->_appEnd;

	}

}



Итак наш реквест умеет определять ту часть приложения в которая нам нужна.

Настало время настройки модуля




class WebModule extends CWebModule

{

	public function init()

	{

		switch(Yii::app()->getRequest->getAppEnd) // здесь все по простому =)

		{

			case 'frontend':

				$this->controllerPath=$this->basePath.DS.'frontend/controllers';

				$this->viewPath=$this->basePath.DS.'frontend/views';

				break;

			case 'backend':

				$this->controllerPath=$this->basePath.DS.'backend/controllers';

				$this->viewPath=$this->basePath.DS.'backend/views';

				break;

		}

	}

}



В роутинге мы можем настроить все типично:




array(

    '<_m:\w+>' => '<_m>/default/index'

    '<_m:\w+>\<_c:\w+>' => '<_m>/<_c>/index'

    '<_m:\w+>\<_c:\w+>\<_a:\w+>' => '<_m>/<_c>/<_a>'

)



Итак что мы имеем. Каждий модуль со своей адмикой

доступной по адресу который ми устанавливаем в Yii::app()->params[‘app_backend_url’];

Буду рад выслушать ваше мнение относительно такого подхода =)