我想检查我的用户是否已填写其个人资料中的某些字段,然后才能访问任何控制器的任何操作.例如
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 - 在配置文件中添加MyGlobalClass到bootstarp数组中:
'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文件中.但是,请确保您很好地记录此更改,因为有人会尝试调试您的代码将完全混淆.
| 归档时间: |
|
| 查看次数: |
38718 次 |
| 最近记录: |