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/config
或 backend/config
中(如果您想要 [=19] =] 仅
'on '.yii\web\Application::EVENT_BEFORE_REQUEST => [
'backend\components\CheckIfLoggedIn','changeLanguage'
] ,
记得将它添加到 id
或 components
索引定义的同一级别
return [
'id' => 'app-backend' ,
'on '.yii\web\Application::EVENT_BEFORE_REQUEST => [
'backend\components\CheckIfLoggedIn','changeLanguage'
] ,
第一次尝试在 changeLanguage
的开头添加一个 die("hello world");
以便确认它正在进入函数 changeLanguage
.
希望对您有所帮助
我正在尝试检查 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/config
或 backend/config
中(如果您想要 [=19] =] 仅
'on '.yii\web\Application::EVENT_BEFORE_REQUEST => [
'backend\components\CheckIfLoggedIn','changeLanguage'
] ,
记得将它添加到 id
或 components
索引定义的同一级别
return [
'id' => 'app-backend' ,
'on '.yii\web\Application::EVENT_BEFORE_REQUEST => [
'backend\components\CheckIfLoggedIn','changeLanguage'
] ,
第一次尝试在 changeLanguage
的开头添加一个 die("hello world");
以便确认它正在进入函数 changeLanguage
.
希望对您有所帮助