Yii博士,如何注册控制器引发的事件


Php Yii, How to register for a event raised by a controller

我想做的是:将组件注册到控制器引发的事件中。

在我的配置main.php中:

'preload' => array(MessageConsumer) // actually an impl class of interface

在我的MessageConsumer impl 中

public function init() {
    Yii::app()->getController()->onMessageReceived = array($this, 'onMessageReceived');
}

预期结果:当init方法触发时,使用者被注册到当前控制器。

实际结果:目前还没有控制器。似乎预加载是在web应用程序执行控制器魔术之前执行的。

所以我尝试了一些类似的东西:
在我的MessageConsumer impl:中

public function init() {
    $self = $this;
    Yii::app()->onBeginRequest(function() use ($self) {
        $controller = Yii::app()->getController();
        if($controller instanceof MessagingController) {
            Yii::app()->getController()->onMessageReceived = array($self, 'onMessageReceived');
        }
    });
}

这也不起作用,因为init()似乎是在网络应用程序引发onBeginRequest()事件后调用的。

是否有一种方法可以注册到控制器引发的事件,而无需将组件显式链接到控制器类?显然,我可以在控制器的构造函数中注册监听器,但我想通过使用配置松散地耦合这两个组件。

也许有一些像"onComponentLoaded"这样的事件我可以注册?由于控制器是一个组件,如果有这样的事件,我希望Yii核心在加载组件时触发事件。

我想这就是您想要的onBeforeAction()

<?php
class YourController extends Controller
{
    //this action is executed before any controller action
    protected function beforeAction($action)
    {
        //do stuff before controll action
        return true;
    }
    //the rest ofyour controller actions and stuff
    public function actionIndex(){
        //[...]
    }
}
?>