在我的Yii 1.x应用程序中,我定义了新的Admin
模块。在init
模块的admin
方法中,我定义了新的user
组件,如下所示:
$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
答案 0 :(得分:1)
默认情况下,方法setComponents
(setComponent
)检查组件是否已定义,它仅将新参数与旧参数合并。
因此,您必须将第二个参数设置为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();
答案 1 :(得分:1)
请来自工作项目的代码。 模块主类中定义的用户组件:
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',
),
所以你可以"为一个用户提供两个会话" 取决于模块(在模块其他会话中,在root -other中)。例如,var_dump(Yii::app()->user->stateKeyPrefix)
out of module给出user_
,但在模块中给出admin_
。
实际上yii使用相同的会话文件,但根据stateKeyPrefix
设置和获取数据(当我们使用setState()
或getState()
时)。
因此,如果您使用userName
将admin
保留在Yii::app()->user->setState('userName', 'John')
模块中,则会将其放入会话文件'admin_userName' => 'John'
中,这意味着您可以从admin
中获取该值使用 Yii::app()->session->get('admin_userName')
模块(例如在root中)。
如果您尝试使用getState
来获取它(模块外),则无法返回正确的值,因为它必须找到user_userName
(因为在root中,对于用户组件'stateKeyPrefix' => 'user_'
)而不是admin_userName
。
谢谢你,并且抱歉长篇大论))