有没有办法从beforeAction()调用操作?

时间:2015-10-21 13:13:39

标签: php yii yii2

有没有办法从Yii2中的beforeAction()方法动态调用任意操作?

3 个答案:

答案 0 :(得分:1)

覆盖Controller中的BeforeAction事件

public function beforeAction($action){

    if(Yii::$app->user->isGuest) {
        return $this->redirect(['index']);
    }

    parent::beforeAction($action);
}

答案 1 :(得分:0)

您可以通过调用beforeAction()内的操作,配置响应并返回false来执行此操作 - 它将阻止执行请求的操作。

public function beforeAction($action){
    if ($this->someCondition()) {
        $response = $this->actionMySecondAction();
        if (!$response instanceof \yii\web\Response) {
            Yii::$app->response->data = $response;
        }
        return false;
    }

    return parent::beforeAction($action);
}

但这是一种黑客行为,你可能会遇到一些奇怪的副作用。您应该重新考虑您的架构以避免此类解决方案。如果您有多步表单,则可以使用一个URL和一个操作 - 分离步骤以分离方法并根据表单状态调用所需方法,而不是URL。无需使用此类黑客,您将避免在http://localhost/form/third-step显示第二步。

答案 2 :(得分:-1)

如果您未在beforeAction中完成该应用,它将继续执行操作并仅在返回操作后执行重定向

要避免此行为,您应该在beforeAction方法中结束应用,并且不要使用带有重定向的返回:

public function beforeAction($action){

    if ($some_conditions && $this->getRoute() != 'site/index') {
        $this->redirect(['site/index']);
        Yii::$app->end();
    }

    return parent::beforeAction($action);
}