我想检查我的用户是否已填写其个人资料中的某些字段,然后才能访问任何控制器的任何操作。 例如
if(empty(field1) && empty(field2))
{
header("Location:/site/error")
}
在yii1中,我可以在init()函数的protected \ components \ Controller.php中完成 但在yii2我不知道在哪里放我的代码。我无法修改核心文件,但不知道如何在我的高级应用程序的后端执行此操作。
我知道我可以使用beforeAction(),但是我有太多的控制器来跟踪每个控制器
答案 0 :(得分:49)
如果您需要在每个控制器和操作之前执行代码,您可以执行以下操作:
1 - 将组件添加到组件目录中,例如(MyGlobalClass
):
namespace app\components;
class MyGlobalClass extends \yii\base\Component{
public function init() {
echo "Hi";
parent::init();
}
}
2 - 将MyGlobalClass
组件添加到配置文件中的组件数组中:
'components' => [
'MyGlobalClass'=>[
'class'=>'app\components\MyGlobalClass'
],
//other components
3 - 将MyGlobalClass
添加到配置文件中的bootstarp
数组中:
'bootstrap' => ['log','MyGlobalClass'],
现在,您可以在每次操作之前看到Hi
。
请注意,如果您不需要使用Events
和Behaviors
,则可以使用\yii\base\Object
代替\yii\base\Component
答案 1 :(得分:22)
创建一个新控制器
namespace backend\components;
class Controller extends \yii\web\Controller {
public function beforeAction($event)
{
..............
return parent::beforeAction($event);
}
}
现在所有控制器都应该扩展后端\ components \ Controller而不是\ yii \ web \ Controller。有了这个,你应该修改每个控制器。我会选择这个解决方案。
我相信你也可以用另一个替换1个类(所以不需要改变任何控制器),比如
\Yii::$classMap = array_merge(\Yii::$classMap,[
'\yii\web\Controller'=>'backend\components\Controller',
]);
在此处查看更多详情:http://www.yiiframework.com/doc-2.0/guide-tutorial-yii-integration.html我从此处获取了代码:https://github.com/mithun12000/adminUI/blob/master/src/AdminUiBootstrap.php
你可以将它放在你的index.php文件中。但是,请确保您很好地记录此更改,因为有人会尝试调试您的代码,这将完全混淆。
答案 2 :(得分:22)
只需将配置文件添加到$ config数组中:
'on beforeAction' => function ($event) {
echo "Hello";
},
答案 3 :(得分:0)
或者,https://github.com/yiisoft/yii2/blob/master/docs/guide/security-authorization.md使用RBAC,根据规则一次限制对控制器操作的访问。为什么要根据用户字段限制对控制器操作的访问权限超出我的范围。如果您在那里设置限制,您将无法访问任何内容(包括登录表单)。
答案 4 :(得分:0)
我认为配置文件上的这段代码可以为您提供帮助:
'on beforeAction' => function ($event) {
// To log all request information
},
'components' => [
'response' => [
'on beforeSend' => function($event) {
// To log all response information
},
],
];