我想做什么:将组件注册到由控制器引发的事件。
在我的配置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');
}
});
}
哪个不起作用,因为似乎在webapp引发onBeginRequest()事件后调用了init()。
有没有办法注册到控制器引发的事件而没有明确地将组件链接到控制器类?显然我可以在控制器的构造函数中注册监听器,但我想通过使用配置松散地耦合2个组件。
也许有一些像我可以注册的“onComponentLoaded”这样的事件?由于Controller是一个组件,我希望Yii核心在有任何组件加载的情况下触发事件,如果有这样的事件的话。
答案 0 :(得分: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(){
//[...]
}
}
?>