在任何控制器的任何操作之前执行我的代码

时间:2014-11-27 23:41:07

标签: yii2

我想检查我的用户是否已填写其个人资料中的某些字段,然后才能访问任何控制器的任何操作。 例如

if(empty(field1) && empty(field2))
{
   header("Location:/site/error")
}

在yii1中,我可以在init()函数的protected \ components \ Controller.php中完成 但在yii2我不知道在哪里放我的代码。我无法修改核心文件,但不知道如何在我的高级应用程序的后端执行此操作。

我知道我可以使用beforeAction(),但是我有太多的控制器来跟踪每个控制器

5 个答案:

答案 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

请注意,如果您不需要使用EventsBehaviors,则可以使用\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
        },
    ],
];