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

Mis*_*ali 32 yii2

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

if(empty(field1) && empty(field2))
{
   header("Location:/site/error")
}
Run Code Online (Sandbox Code Playgroud)

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

我知道我可以使用beforeAction()但我有太多的控制器来做这件事并跟踪每个控制器

Ali*_*our 51

如果您需要在每个控制器和操作之前执行代码,您可以执行以下操作:

1 - 将组件添加到组件目录中,例如(MyGlobalClass):

namespace app\components;
class MyGlobalClass extends \yii\base\Component{
    public function init() {
        echo "Hi";
        parent::init();
    }
}
Run Code Online (Sandbox Code Playgroud)

2 - MyGlobalClass在配置文件中将组件添加到组件数组中:

'components' => [
    'MyGlobalClass'=>[
        'class'=>'app\components\MyGlobalClass'
     ],
     //other components
Run Code Online (Sandbox Code Playgroud)

3 - 在配置文件中添加MyGlobalClassbootstarp数组中:

'bootstrap' => ['log','MyGlobalClass'],
Run Code Online (Sandbox Code Playgroud)

现在,您可以Hi在每个动作之前看到.

请注意,如果您不需要使用Events,Behaviors您可以使用\yii\base\Object而不是\yii\base\Component


Rus*_*kov 25

只需将配置文件添加到$ config数组中:

    'on beforeAction' => function ($event) {
           echo "Hello";
    },
Run Code Online (Sandbox Code Playgroud)


Mih*_* P. 22

创建一个新的控制器

namespace backend\components;
class Controller extends \yii\web\Controller {
    public function beforeAction($event)
    {
        ..............
        return parent::beforeAction($event);
    }
}
Run Code Online (Sandbox Code Playgroud)

您的所有控制器现在应该扩展后端\ components\Controller而不是\ yii\web\Controller.有了这个,你应该修改每个控制器.我会选择这个解决方案.

我相信你也可以用另一个替换1个类(所以不需要对任何控制器进行任何更改),类似于

\Yii::$classMap = array_merge(\Yii::$classMap,[
                '\yii\web\Controller'=>'backend\components\Controller',
            ]);
Run Code Online (Sandbox Code Playgroud)

在这里查看更多详细信息:http://www.yiiframework.com/doc-2.0/guide-tutorial-yii-integration.html,我从这里获取代码:https://github.com/mithun12000/adminUI/blob/主/ SRC/AdminUiBootstrap.php

你可以把它放在你的index.php文件中.但是,请确保您很好地记录此更改,因为有人会尝试调试您的代码将完全混淆.