在Yii 2中收听退出事件

时间:2015-02-07 15:54:01

标签: events yii2 logout

所以我知道Yii::$app->user会在注销过程中触发这些事件。

const EVENT_BEFORE_LOGIN = 'beforeLogin';
const EVENT_AFTER_LOGIN = 'afterLogin';

但是在每个请求的开头添加监听器的正确位置在哪里?

2 个答案:

答案 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事件将被执行。

我已经选择在我的用户模型中声明在注销之前完成工作的功能,以便于查找和编辑。