Yii2 在任何控制器的任何操作之前执行我的代码 namespace backend\components; class Controller extends \yii\web\Controller { public function beforeAction($event) { .............. return parent::beforeAction($event); } }

Yii2 在任何控制器的任何操作之前执行我的代码 namespace backend\components; class Controller extends \yii\web\Controller { public function beforeAction($event) { .............. return parent::beforeAction($event); } },yii2,Yii2,我想检查我的用户在访问任何控制器的任何操作之前,是否已在其配置文件中填写了某些字段。 namespace backend\components; class Controller extends \yii\web\Controller { public function beforeAction($event) { .............. return parent::beforeAction($event); } } 比如说 if

我想检查我的用户在访问任何控制器的任何操作之前,是否已在其配置文件中填写了某些字段。
namespace backend\components;
class Controller extends \yii\web\Controller {
    public function beforeAction($event)
    {
        ..............
        return parent::beforeAction($event);
    }
}
比如说

if(empty(field1) && empty(field2))
{
   header("Location:/site/error")
}
在yii1中,我可以在init()函数中的protected\components\Controller.php中执行此操作
namespace backend\components;
class Controller extends \yii\web\Controller {
    public function beforeAction($event)
    {
        ..............
        return parent::beforeAction($event);
    }
}
但在yii2中,我不确定我的代码放在哪里。我无法修改核心文件,但不确定如何在我的高级应用程序的后端使其工作


我知道我可以使用beforeAction()用户,但我有太多的控制器来执行此操作,为了跟踪每个控制器

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

namespace backend\components;
class Controller extends \yii\web\Controller {
    public function beforeAction($event)
    {
        ..............
        return parent::beforeAction($event);
    }
}
1-将组件添加到组件目录中,例如(
MyGlobalClass
):

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

'components' => [
    'MyGlobalClass'=>[
        'class'=>'app\components\MyGlobalClass'
     ],
     //other components
'bootstrap' => ['log','MyGlobalClass'],
3-将
MyGlobalClass
添加到配置文件中的
bootstarp
数组中:

'components' => [
    'MyGlobalClass'=>[
        'class'=>'app\components\MyGlobalClass'
     ],
     //other components
'bootstrap' => ['log','MyGlobalClass'],
现在,您可以在每个操作之前看到
Hi

请注意,如果您不需要使用
事件
行为
,您可以使用
\yii\base\Object
而不是
\yii\base\Component

创建一个新的控制器
namespace backend\components;
class Controller extends \yii\web\Controller {
    public function beforeAction($event)
    {
        ..............
        return parent::beforeAction($event);
    }
}
所有控制器现在都应该扩展backend\components\Controller,而不是\yii\web\Controller。这样,您应该修改每个控制器。我会选择这个解决方案

namespace backend\components;
class Controller extends \yii\web\Controller {
    public function beforeAction($event)
    {
        ..............
        return parent::beforeAction($event);
    }
}
我相信您也可以将一个类替换为另一个类(因此无需更改任何控制器),例如

namespace backend\components;
class Controller extends \yii\web\Controller {
    public function beforeAction($event)
    {
        ..............
        return parent::beforeAction($event);
    }
}
\Yii::$classMap = array_merge(\Yii::$classMap,[
                '\yii\web\Controller'=>'backend\components\Controller',
            ]);
在这里查看更多详细信息:我从这里获取了代码:


您可以将其放入index.php文件中。但是,请确保您很好地记录了此更改,因为将要来调试您的代码的人将对此感到完全困惑。

或者,使用RBAC,根据规则一次限制对控制器操作的访问。我无法理解为什么要基于用户字段限制对控制器操作的访问。如果在此处设置限制,您将无法访问任何内容(包括登录表单)。

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

namespace backend\components;
class Controller extends \yii\web\Controller {
    public function beforeAction($event)
    {
        ..............
        return parent::beforeAction($event);
    }
}
    'on beforeAction' => function ($event) {
           echo "Hello";
    },

只是我认为配置文件中的代码可以帮助您:

'on beforeAction' => function ($event) {
      // To log all request information
},
'components' => [
    'response' => [
        'on beforeSend' => function($event) {
            // To log all response information
        },
    ],
];

@MiskoMali你使用模块吗?另外,你需要与表单交互吗?或者你需要在每个控制器动作之前执行一些代码?对于表单,如果您使用模型,您可以使用
beforeValidate()
@MiskoMali。如果您使用模块,您可以在
init()
方法中编写代码,该方法将在该模块的每个控制器之前执行。我只需要在每个操作之前执行一些代码,与任何表单或数据库无关。我使用的是供应商文件夹中的模块,而不是后端文件夹中的模块。在后端文件夹中,我只使用控制器和Models@MihaiP. 不,亲爱的,这只是一个类(组件、对象、事件或行为),将在应用程序引导中启动。一旦应用程序运行,这个类的
init()
方法就会被调用。这个方法最适合处理“全局”预处理事件。是的,它非常好,我认为这是最好的答案!
namespace backend\components;
class Controller extends \yii\web\Controller {
    public function beforeAction($event)
    {
        ..............
        return parent::beforeAction($event);
    }
}