代码之家  ›  专栏  ›  技术社区  ›  Blackjack

使所有控制器中的每个函数在执行函数之前先执行一些代码,而不在Yii2中的每个函数中添加代码

  •  0
  • Blackjack  · 技术社区  · 7 年前

    我有一个代码来检查会话是否已设置 乙2 ,我在一个控制器的函数中添加了代码,这就是代码

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

    我在10个控制器中有超过50个函数,我希望每个函数都使用该代码,我如何才能使它不把代码一个接一个地放在每个函数中?

    2 回复  |  直到 7 年前
        1
  •  0
  •   rob006    7 年前

    你可以为你的应用程序创建基本控制器,并从中扩展所有其他控制器。然后你可以加上 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);
    }
    
        2
  •  -1
  •   Maksym Fedorov    7 年前

    您可以创建简单的行为来处理 '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(),
            ],
        ];
    }