我想要做的:将组件注册到控制器引发的事件。
在我的配置 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 核心在加载组件时触发事件,如果有这样的事件的话。