我正在学习zf2事件,下面是我的代码:
module.php
public function init(ModuleManagerInterface $managers) {
$eventManager = $managers->getEventManager();
/* $eventManager->attach('do', array($this, function ($e) {
$event = $e->getName();
$params = $e->getParams();
printf(
'Handled event "%s", with parameters %s',
$event,
json_encode($params)
);
})
); */
$eventManager->attach('do', array($this, 'demoEvent') );
}
public function demoEvent(Event $e) {
echo ' in demo Event';
}
并且在控制器功能中我已触发事件。
$this->getEventManager()->trigger('do', $this, ['aman', 'deep']);
但永远不会调用demoEvent操作。即使我尝试使用闭包,你可以在上面看到,但它给了我“提供的无效回调”异常。
我做错了什么。有人可以帮助我更好地理解事件管理器。感谢
答案 0 :(得分:1)
你的方法几乎是正确的。问题是你要附加事件监听器" demoEvent"到应用程序事件管理器,而不是控制器的事件管理器。
作为控制器,假设它扩展AbstractActionController
,也将能够触发它自己的事件。
因此,您需要更新附加侦听器的方式,以确保它已使用正确的事件管理器进行注册。
有几个选择。
在控制器工厂内附加事件侦听器。您可以在工厂内调用$controller->getEventManager()->attach();
,这样在创建控制器时,始终会附加事件监听器。
覆盖attachDefaultListeners()
中定义的AbstractActionController
,当控制器管理器初始化控制器时,将自动调用此parent::attachDefaultListeners()
。这提供了对控制器事件管理器的访问,请务必记住调用class Module
{
public function onBootstrap(MvcEvent $mvcEvent)
{
$sharedManager = $mvcEvent->getEventManager()->getSharedManager();
$sharedManager->attach(
'Foo\\Controller\\BarController', // Event manager 'identifier', which one we want
'do' // Name of event to listen to
[$this, 'demoEvent'], // The event listener to trigger
1, // event priority
);
}
public function demoEvent($event)
{
}
}
。
最后,您可以使用"共享事件管理器"这实际上只是目标事件管理器的代理(尽管它的名称,而不是事件管理器)。这允许您只稍微修改您编写的代码并保持事件监听器注册独立于触发上下文(控制器)。
例如。
{{1}}