所以我知道Yii::$app->user
会在注销过程中触发这些事件。
const EVENT_BEFORE_LOGIN = 'beforeLogin';
const EVENT_AFTER_LOGIN = 'afterLogin';
但是在每个请求的开头添加监听器的正确位置在哪里?
答案 0 :(得分:3)
最好的地方是在处理yii/web/User
身份的班级;通常,这是common/models/User
。
在该课程中,您可以进行以下初始化。
public function registerLogoutHook()
{
$this->on(\yii\web\User::EVENT_AFTER_LOGOUT, function ($e) {
Yii::$app->controller->goHome();
});
}
您可以选择在成功登录的[身份`common / models / User]的Web用户对象上注册。逻辑可以如下
// [ ... omitted code ... ]
// $model is an instance of LoginForm
if ($model->load(Yii::$app->request->post()) && $model->login()) {
Yii::$app->user->identity->registerLogoutHook();
return $this->redirect(['customers/view', 'id' => Yii::$app->user->identity->id]);
}
// [ ... omitted code ... ]
另一种让它在现在工作的方式(" yiisoft / yii2":" 2.0.7")是将事件处理程序添加到配置文件中。这样,所有处理程序都在应用程序生命周期的早期设置。
所以在你的main.php
中,你会回来......
[
// ... some other things ...
'components' => [
// ... some other components ...
'user' => [
// ... some configuration for yii\web\User ...
'on beforeLogout' => function ($e) {
Yii::trace('Logout events are working!!!');
},
// ... more configurations for yii\web\User ...
],
// ... some more components ...
],
// ... some more things
]
对于处理程序,您可以使用回调,函数名称或指定对象及其方法的数组。 These methods of registering an event are enumerated here
beforeLogout
可以更改为yii\web\User
答案 1 :(得分:-1)
经过大量的代码挖掘后,我终于找到了问题所在。您可能会认为,由于您将用户模型作为标识传递给注销功能并为其分配事件,因此它将起作用,但实际上正在触发当前组件的事件。
这意味着,如果您执行上面建议的操作并将事件分配给您的用户模型,则不会触发该事件。相反,您需要将事件分配给用户组件本身。
我的解决方案(实际上有效)
在用户模型:
中public static function beforeLogoutHook(){
// Do whatever
}
代码中的某处我建议在某个全球范围内执行此操作在我的情况下,我的主控制器正由其他控制器进行扩展。
public function auth(){
$user = new User();
$user->setAttributes($attributes,false);
Yii::$app->user->login($user);
Yii::$app->user->on(\yii\web\User::EVENT_BEFORE_LOGOUT,function($e){
User::beforeLogout();
});
}
现在您可以随时调用Yii::$app->user->logout();
,beforeLogout
事件将被执行。
我已经选择在我的用户模型中声明在注销之前完成工作的功能,以便于查找和编辑。