Доброго времени, хочу поделиться своим соображением насчет очередного способа разделения приложения на юзер и админ части. Суть состоит в том, чтоб приложение во время запроса могло определить к какой части осуществляеться запрос.
Итак наш клас 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’];
Буду рад выслушать ваше мнение относительно такого подхода =)