ZF2:如何为dispatch.error附加模块特定的侦听器

时间:2013-07-30 13:33:59

标签: php events zend-framework2

有没有办法可以在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');
    });
}

1 个答案:

答案 0 :(得分:1)

它正在调度而不是dispatch.error的原因是调度事件从控制器内部触发(参见Zend \ Mvc \ Controller \ AbstractController :: dispatch)

因为您使用自己的命名空间控制器扩展此类,所以可以将事件与该命名空间相关联。

但是,可能会在加载控制器(以及命名空间的上下文)之前触发dispatch.error事件。这是根据Zend \ Mvc \ DispatchListener中的多个条件发生的。

为了自定义处理dispatch.error的方式,您可能需要为该事件编写自定义侦听器,甚至编写自己的DispatchListener(尽管我建议不要这样做)。然后,您可以查看routeMatch以了解您接下来要做的事情。如果您正在使用ModuleRouteListener,这可能非常简单。