Events ZF3事件管理器仅适用于事件调度
在ZF3自定义模块中,我需要截获一些事件 在Events ZF3事件管理器仅适用于事件调度,events,zend-framework3,Events,Zend Framework3,在ZF3自定义模块中,我需要截获一些事件 在module.config.php中,函数init()是: public function init(ModuleManager $manager) { $eventManager = $manager->getEventManager(); $sharedEventManager = $eventManager->getSharedManager(); $sharedEventManager
module.config.php
中,函数init()
是:
public function init(ModuleManager $manager)
{
$eventManager = $manager->getEventManager();
$sharedEventManager = $eventManager->getSharedManager();
$sharedEventManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'onDispatch'], 100);
$sharedEventManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH_ERROR, [$this, 'onDispatchError'], 110);
}
在同一类中,有两个函数:
public function onDispatch(MvcEvent $event)
{
echo 'testOnDispatch';
die;
}
public function onDispatchError(MvcEvent $event)
{
echo 'testOnDispatchError';
die;
}
EVENT\u DISPATCH
事件在没有任何问题的情况下被触发,但EVENT\u DISPATCH\u ERROR
未被触发。在一些测试之后,我看到只有事件\u DISPATCH
事件被触发
在视图管理器配置中,display\u not\u found\u reason
和display\u exceptions
都设置为TRUE
。如果我用事件调度
(两次事件调度
)替换事件调度
)错误,则优先级方面一切正常
我遗漏了什么?可能仅仅意味着您正在某个地方调度某个事件,并且在调度事件代码/触发器期间代码中没有错误。在
onDispatch
函数中,您可以做Zend在应用程序
类中已经做过的测试。查看您的供应商包,文件:vendor/zendframework/zendmvc/src/Application.php
第330行()。也可以。Gl&hfrkeet,谢谢您的回复。对于事件\u调度\u错误
,这是有意义的。同时,作为一个例子,EVENT\u FINISH
也不起作用。在MVC完成的任何情况下都应该调度该事件,对吗?理论上:是的。但是,要找到它的实现位置,看看它是否在任何地方被调用。如果您使用的是PhpStorm,则可以通过按住Ctrl键并单击(在常量上,或在apple上单击“Cmd”)找到它的声明。对常量声明执行相同操作(Ctrl/Cmd+单击)将显示(或要求显示)所述常量的所有实现。查看结果,看看是否使用了它。从github链接(prev comment),它将沿着$events->triggerEvent($event)的路线运行
查找使用的MvcEvent::EVENT\u DISPATCH
不是const EVENT\u DISPATCH
的地方。我按照您的建议,在zendframework\zend mvc\src\sendsresponselistener.php中找到了EVENT\u FINISH
注册的第74行(仅一次)实际上调用了回调函数sendResponse
。我还在第283行的zend eventmanager\src\eventmanager.php中找到了函数triggerListeners
。我检查了事件的名称,是的,会触发EVENT\u DISPATCH\u ERROR
on route ERROR或EVENT\u FINISH
等事件。这个函数的有趣之处在于count$listOfListenersByPriority
是1。因此,我觉得模块中的侦听器没有连接。我在这里找到了一个解决方法[不确定这是错误还是功能…无论如何,感谢您的帮助。根据您的建议,我学到了很多可能性。