有没有办法可以在Zend Framework 2中为事件dispatch.error
附加一个事件监听器,其中该监听器只会附加到与Module.php相关的EventManager上?
我通过将dispatch
的侦听器附加到全局SharedManager并将当前Module.php的名称空间作为第一个参数传递来实现此目的。当我为dispatch.error
尝试相同时,它工作得很漂亮,但不起作用。
这是Module.php中的一个例子:
public function init(ModuleManager $moduleManager)
{
$sharedManager = $moduleManager->getEventManager()->getSharedManager();
$sharedManager->attach(__NAMESPACE__, 'dispatch', function($e) {
exit('IT WORKS');
});
$sharedManager->attach(__NAMESPACE__, 'dispatch.error', function($e) {
exit('IT DOES NOT WORK');
});
}
答案 0 :(得分:1)
它正在调度而不是dispatch.error的原因是调度事件从控制器内部触发(参见Zend \ Mvc \ Controller \ AbstractController :: dispatch)
因为您使用自己的命名空间控制器扩展此类,所以可以将事件与该命名空间相关联。
但是,可能会在加载控制器(以及命名空间的上下文)之前触发dispatch.error事件。这是根据Zend \ Mvc \ DispatchListener中的多个条件发生的。
为了自定义处理dispatch.error的方式,您可能需要为该事件编写自定义侦听器,甚至编写自己的DispatchListener(尽管我建议不要这样做)。然后,您可以查看routeMatch以了解您接下来要做的事情。如果您正在使用ModuleRouteListener,这可能非常简单。