Yii2 将行为附加到 Application::EVENT_BEFORE_REQUEST

Yii2 Attach behavior to Application::EVENT_BEFORE_REQUEST

我正在尝试检查 Application::EVENT_BEFORE_REQUEST 上的 cookie。我所做的是覆盖 Behavior 模型中的 events 函数和 return 自定义函数 checkLanguage 我上面提到的事件。我在我的控制器中触发 as beforeRequest(起初我在 backend/config/main.php 中尝试过,但似乎无法从那里到达 CheckIfLoggedIn class )并且请求开始了e 到 CheckIfLoggedIn class 中的 public function events() 但不会继续到 checkLanguage 函数。 这是我的 SiteController 行为:

public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'actions' => ['login', 'error'],
                        'allow' => true,
                    ],
                    [
                        'actions' => ['logout', 'index', 'language'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'logout' => ['post'],
                ],
            ],
            'as beforeRequest' => [
                'class' => 'backend\components\CheckIfLoggedIn'
            ]
        ];
    }

CheckIfLoggedIn.php class:

<?php

namespace backend\components;

use yii\base\Behavior;
use yii\web\Application;

class CheckIfLoggedIn extends Behavior
{
    public function events()
    {
        return [
            Application::EVENT_BEFORE_REQUEST => "changeLanguage"
        ];
    }

    public function changeLanguage()
    {
        if(\Yii::$app->getRequest()->getCookies()->has('lang')){
            \Yii::$app->language = \Yii::$app->getRequest()->getCookies()->getValue('lang');
        }
    }
}

问题是你试图在行为内部的控制器级别附加一个 Application 事件,而文档说你应该使用 Application 配置。

进行以下更新,从 class 中删除 events() 函数。

backend/components/CheckIfLoggedIn.php

namespace backend\components;
use yii\base\Behavior;

class CheckIfLoggedIn extends Behavior
{

    public function changeLanguage()
    {
        if(\Yii::$app->getRequest()->getCookies()->has('lang')){
            \Yii::$app->language = \Yii::$app->getRequest()->getCookies()->getValue('lang');
        }
    }
}

并将以下内容添加到 common/configbackend/config 中(如果您想要 [=19] =] 仅

'on '.yii\web\Application::EVENT_BEFORE_REQUEST => [
    'backend\components\CheckIfLoggedIn','changeLanguage'
] ,

记得将它添加到 idcomponents 索引定义的同一级别

return [
    'id' => 'app-backend' ,
    'on '.yii\web\Application::EVENT_BEFORE_REQUEST => [
        'backend\components\CheckIfLoggedIn','changeLanguage'
    ] ,

第一次尝试在 changeLanguage 的开头添加一个 die("hello world"); 以便确认它正在进入函数 changeLanguage.

希望对您有所帮助