6把刀 2016-03-15 21:08:36 5164次浏览 1条评论 2 1 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',
       ];
        
    }

}
觉得很赞
  • 评论于 2016-03-16 11:11 举报

    直接on beforeRequest不是更好,直接就绑定事件了,何必要添加行为,再在行为里边绑定

    2 条回复
    评论于 2016-03-16 15:46 回复

    一样的,行为扩展性更强。直接用on一样,as 行为扩展更好

    评论于 2016-03-16 16:17 回复

    比如,你这个行为里要处理很多应用的事件,在行为里好管理,在配置上你就行写多个on
    我喜欢行为。用事件只是简单的处理。行为扩展更强。

您需要登录后才可以评论。登录 | 立即注册