3

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

在我的配置 main.php 中:

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

在我的 MessageConsumer 实现中

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');
        }
    });
}

这也不起作用,因为似乎在 webapp 引发 onBeginRequest() 事件之后调用了 init() 。

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

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

4

1 回答 1

1

我想这就是你要找的,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(){
        //[...]
    }
}
?>
于 2013-08-14T00:17:53.590 回答