2015-05-13 68 views
1

在我的Yii 1.x應用程序中,我定義了新的Admin模塊。在admin模塊的init方法我定義的新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
所以你必須第二個參數的重新定義新的成分(組件)設置爲 false

請從工作項目中獲取代碼。在模塊主類 用戶自定義組件:

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) out of module給出user_,但在模塊中給出admin_實際上yii使用相同的會話文件,但設置和獲取數據取決於stateKeyPrefix(當我們使用setState()getState()時)。

所以如果你使用Yii::app()->user->setState('userName', 'John')保持userNameadmin模塊,它把在會議文件'admin_userName' => 'John',這意味着你可以使用Yii::app()->session->get('admin_userName')獲取值出admin模塊(例如,在根目錄)中。 如果您嘗試使用getState來獲取它(模塊外),它將無法返回正確的值,因爲它必須找到user_userName(因爲在根中,對於用戶組件'stateKeyPrefix' => 'user_')而不是admin_userName

謝謝你,長期表達遺憾))

+0

啊哈,不同的是,在第一個版本中,您調用了$ this-> setComponents,並且在這個Yii :: app() - > setComponents()中。我已經檢查過它是如何在Gii模塊中完成的,並且是使用Yii :: app() - > setComponents()並且應該工作。 – MrD

+1

@ Mr.M 啊,對不起,我沒有仔細的使用'$ this',我複製了你的代碼並設置了第二個參數)) –

+0

我會測試並且會讓你知道它是否工作,我肯定會的! – MrD

1

默認方法setComponentssetComponent)檢查,如果組件已定義它只是合併新,舊PARAMS。

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 我在工作項目中添加了一段代碼。 –

相關問題