2015-05-13 2 views
1

В моем приложении Yii 1.x я определил новый модуль Admin. В init способе admin модуля я определил новый user компонент, как это:Как правильно создать разные логины для разных модулей в схеме Yii

$this->setComponents(array(
      'user'=>array(
       'class' => 'CWebUser', 
       // enable cookie-based authentication 
       'allowAutoLogin'=>true, 
       'baseUrl'=>Yii::app()->createUrl("admin/user/login"), 
       'stateKeyPrefix' => '_admin', 
      ), 
     )); 

Теперь, я надеюсь, что я могу сделать следующее:

Yii::app()->getModule("admin")->user->login($this->_identity,$duration) 

или

Yii::app()->getModule("admin")->user->logout(); 

но это не работает.

Когда я печатаю свой модуль (var_dump(Yii::app()>getModule("admin"))), я вижу, что компонент user не определен.

object(AdminModule)[14] 
    public 'defaultController' => string 'default' (length=7) 
    public 'layout' => null 
    public 'controllerNamespace' => null 
    public 'controllerMap' => 
    array (size=0) 
     empty 
    private '_controllerPath' (CWebModule) => null 
    private '_viewPath' (CWebModule) => null 
    private '_layoutPath' (CWebModule) => null 
    public 'preload' => 
    array (size=0) 
     empty 
    public 'behaviors' => 
    array (size=0) 
     empty 
    private '_id' (CModule) => string 'admin' (length=10) 
    private '_parentModule' (CModule) => null 
    private '_basePath' (CModule) => string '/srv/www/htdocs/public/project/application/protected/modules/admin' (length=71) 
    private '_modulePath' (CModule) => null 
    private '_params' (CModule) => null 
    private '_modules' (CModule) => 
    array (size=0) 
     empty 
    private '_moduleConfig' (CModule) => 
    array (size=0) 
     empty 
    private '_components' (CModule) => 
    array (size=0) 
     empty 
    private '_componentConfig' (CModule) => 
    array (size=1) 
     'user' => 
     array (size=4) 
      'class' => string 'CWebUser' (length=8) 
      'allowAutoLogin' => boolean true 
      'baseUrl' => string '/project/application/index.php/admin/user/login' (length=52) 
      'stateKeyPrefix' => string '_admin' (length=11) 
    private '_e' (CComponent) => null 
    private '_m' (CComponent) => null 

ответ

1

Пожалуйста, код из рабочего проекта. Defined компонент пользователя в модуле основного класса:

public function init() { 
    parent::init(); 
    $this->setImport(array(
     'admin.models.*', 
     'admin.components.*', 
    )); 
    Yii::app()->setComponents(array(
     'user'=>array(
      'class'=>'AdminWebUser', 
      'allowAutoLogin'=>true, 
      'loginRequiredAjaxResponse'=>'Dear admin, your session expired, login and try again', 
      'stateKeyPrefix'=>'admin_', 
      'authTimeout'=>14400, 
     ),  
    ), false); 
} 

и компонент пользователя по умолчанию определяется в главном конфигурационном файле:

'user'=>array(
    'class'=>'WebUser', 
    'loginRequiredAjaxResponse'=>'Your session expired, login and try again', 
    'autoRenewCookie'=>false, 
    'allowAutoLogin'=>false, 
    'stateKeyPrefix'=>'user_', 
    'loginUrl'=>'/home/login', 
), 

Так что вы можете «две сессии для одного пользователя» в зависимости от модуля (в модуле другого сеанса, в корневой -другой). Например, var_dump(Yii::app()->user->stateKeyPrefix) вне модуля дает user_, но в модуле дается admin_. Фактически yii использует тот же файл сеанса, но устанавливает и получает данные в зависимости от stateKeyPrefix (когда мы используем setState() или getState()).

Так что если вы держите userName в admin модуле с помощью Yii::app()->user->setState('userName', 'John'), он помещает в файл сессии 'admin_userName' => 'John', это означает, что вы можете получить это значение из admin модуля (например, в корне), используя Yii::app()->session->get('admin_userName'). Если вы попытаетесь получить его (из модуля) с помощью getState, он не сможет вернуть вам правильное значение, потому что он должен найти user_userName (потому что в корне, для пользовательского компонента 'stateKeyPrefix' => 'user_') вместо admin_userName.

Спасибо и извините за длинное выражение))

+0

Ага, разница в том, что в первой версии вы назвали $ this-> setComponents и в этом Yii :: app() -> setComponents(). Я проверил, как это делается в модуле Gii, и используется yep Yii :: app() -> setComponents() и должен работать. – MrD

+1

@ Mr.M Ах, извините, я не очень тщательно использовал '$ this', я скопировал ваш код и установил второй параметр)) –

+0

Я буду тестировать и сообщим вам, если он работает, Конечно, это будет! – MrD

1

По умолчанию используется метод setComponents (setComponent) проверяет, если компонент уже определен, что только слияние нового Params со старыми. Таким образом, вы должны установить второй параметр в false для переопределения нового компонента (компоненты):

public function init() { 
    parent::init(); 

    $this->setComponents(array(
     'user'=>array(
      'class' => 'CWebUser', 
      // enable cookie-based authentication 
      'allowAutoLogin'=>true, 
      'baseUrl'=>Yii::app()->createUrl("admin/user/login"), 
      'stateKeyPrefix' => '_admin', 
     ), 
    ), false); 
} 

Кстати, внутри модуля вы можете использовать компонент без вызова модуля:

Yii::app()->user->login($this->_identity,$duration); 
Yii::app()->user->logout(); 
+0

Я думал, что это будет работать, но он не работает, даже когда я ставлю FALSE в качестве второго параметра. Любой другой пример или рабочий пример? – MrD

+0

@ Mr.M Я добавляю новый ответ с куском кода из рабочего проекта. –

Смежные вопросы