使所有控制器中的每个功能在执行功能之前先执行一些代码,而无需在Yii2中的每个功能中添加代码

时间:2018-10-17 17:47:28

标签: yii2

我在 Yii2 中有一个用于检查是否已设置会话的代码,我在控制器的函数内部添加了代码,这是代码

if(!isset($session['selectedMonth'])){
        return $this->redirect(['select-period/month']);
        return false;
}

我在10个控制器中有50多个功能,我希望每个功能都使用该代码,如何在不将代码逐一放入每个功能的情况下实现呢?

2 个答案:

答案 0 :(得分:0)

您可以为您的应用创建基本控制器,并从中扩展所有其他控制器。然后,您可以在此基本控制器中添加beforeAction()方法,以便从基本控制器继承的所有控制器都可以使用该方法:

public function beforeAction($action) {
    // initialize $session here

    if(!isset($session['selectedMonth'])){
        Yii::$app->response->redirect(['select-period/month']);
        return false;
    }

    return parent::beforeAction($action);
}

答案 1 :(得分:-1)

您可以创建将处理'before action' event的简单行为,例如:

use Yii;
use yii\base\Behavior;
use yii\base\Controller;

class RedirectBehavior extends Behavior
{
    public function events()
    {
        return [
            Controller::EVENT_BEFORE_ACTION => 'beforeAction',
        ];
    }

    public function beforeAction($event)
    {
        if (Yii::$app->session->has('selectedMonth')){
           return;
        }

        Yii::$app->getResponse()->redirect(['select-period/month'])->send();
     }
}

并将其附加到您的控制器上

public function behaviors()
{
    return [
        'redirect' => [
            'class' => RedirectBehavior::className(),
        ],
    ];
}