我目前正在研究一种捕捉所有控制器动作的简单方法。 正如Zend 2文档所指定的那样,您可以使用'*'通配符来监听多个事件。
每个控制器在完成重要操作时触发事件管理器(如createAction,deleteAction等),但我无法捕捉到它......我正在尝试这种方式:
$sharedEventManager->attach('*\Controller\*', '*', function ($e) {});
我认为通配符不能与关键字一起使用,只能单独使用,但它会捕获所有事件而不是我的控制器事件......
任何帮助?
谢谢。
答案 0 :(得分:0)
Zend Framework 2事件管理器无法使用此处使用的glob pattern。在共享事件管理器中使用标识符有两种选择:
*
触发所有事件然而,还有其他选择。您可能已经知道,事件管理器可以有多个标识符。所有控制器都扩展了Zend\Mvc\Controller\AbstractController
have five identifiers registered:
Zend\Stdlib\DispatchableInterface
__CLASS
(因此,Zend\Mvc\Controller\AbstractController
)get_class($this)
(因此,例如MyModule\Controller\FooBarController
$this->eventIdentifier
(因此,您在此属性中设置的任何内容)substr(get_class($this), 0, strpos(get_class($this), '\\'))
(因此,例如MyModule
)对于抽象动作控制器和抽象的restful控制器都是如此。
因此,要收听单个模块中的所有控制器,请使用MyModule
作为标识符。然后检查目标是否实现了DispatchableInterface
。
要收听所有模块中的所有控制器,请使用Zend\Mvc\Controller\AbstractController
或Zend\Stdlib\DispatchableInterface
。据我了解您的问题,您正在寻找其中一个标识符。
NB。意识到总是另一个目标可以触发事件管理器内的事件。因此,如果您使用$controller = $e->getTarget()
依赖控制器,请始终检查此目标是否为DispatchableInterface的实例!