实现动态处理模块 [ 2.0 版本 ]
需求:有A,B,C modules 用户可以自行的在管理面板选择使用模块(这里可以有很多地方可以扩展,比如用户权限,当用户有一定的权限,就可以使用高级模块,也可以是用户使用积分购买的模块。)
这个处理方法,定在Application应用的EVENT_BEFORE_REQUEST事件,这是一个处理请求之前的事件,在这里动态的处理,是比较理想的。
在应用中比如backend下的config/main.php配置文件中添加行为
'as beforeRequest' => [
'class' => 'backend\components\ModulesBehavior',
],
在新建一个行为backend\components\ModulesBehavior.php
namespace backend\Components;
use yii\web\Application;
use yii\base\Behavior;
class ModulesBehavior extends Behavior
{
public $model;
//处理init
public function init(){
}
//绑定事件,可以ju一反三
public function events()
{
return [
Application::EVENT_BEFORE_REQUEST => 'beforeRequest',
];
}
// 还要注意,这个函数的签名,要满足事件handler的要求。
public function beforeRequest($event)
{
//这里可以做的事就很多了,比如$event->owner就是所有者,里面的$this是行为本身
//比如调用Yii::$app,或者model处理好后再绑定对应的modules
//注意modules模块本身还可以有 模块,那可以在模块的init里使用$this->modules来绑定模块,事件与行为,要理解什么是绑定者,什么是触发者,只能是理解,理解了,就很简单了。
\Yii::$app->modules = [
'commit' => 'backend\modules\commit\Module',
];
}
}
6把刀
注册时间:2016-02-27
最后登录:2020-11-11
在线时长:61小时30分
最后登录:2020-11-11
在线时长:61小时30分
- 粉丝8
- 金钱610
- 威望80
- 积分2020
共 1 条评论
直接on beforeRequest不是更好,直接就绑定事件了,何必要添加行为,再在行为里边绑定
一样的,行为扩展性更强。直接用on一样,as 行为扩展更好
比如,你这个行为里要处理很多应用的事件,在行为里好管理,在配置上你就行写多个on
我喜欢行为。用事件只是简单的处理。行为扩展更强。