zend 2事件管理器通配符+关键字

时间:2014-02-27 17:29:31

标签: php logging controller event-handling zend-framework2

我目前正在研究一种捕捉所有控制器动作的简单方法。 正如Zend 2文档所指定的那样,您可以使用'*'通配符来监听多个事件。

每个控制器在完成重要操作时触发事件管理器(如createAction,deleteAction等),但我无法捕捉到它......我正在尝试这种方式:

$sharedEventManager->attach('*\Controller\*', '*', function ($e) {});

我认为通配符不能与关键字一起使用,只能单独使用,但它会捕获所有事件而不是我的控制器事件......

任何帮助?

谢谢。

1 个答案:

答案 0 :(得分:0)

Zend Framework 2事件管理器无法使用此处使用的glob pattern。在共享事件管理器中使用标识符有两种选择:

  1. 使用事件管理器的确切指定标识符
  2. 使用通配符*触发所有事件
  3. 然而,还有其他选择。您可能已经知道,事件管理器可以有多个标识符。所有控制器都扩展了Zend\Mvc\Controller\AbstractController have five identifiers registered

    1. Zend\Stdlib\DispatchableInterface
    2. __CLASS(因此,Zend\Mvc\Controller\AbstractController
    3. get_class($this)(因此,例如MyModule\Controller\FooBarController
    4. $this->eventIdentifier(因此,您在此属性中设置的任何内容)
    5. substr(get_class($this), 0, strpos(get_class($this), '\\'))(因此,例如MyModule
    6. 对于抽象动作控制器和抽象的restful控制器都是如此。

      因此,要收听单个模块中的所有控制器,请使用MyModule作为标识符。然后检查目标是否实现了DispatchableInterface

      要收听所有模块中的所有控制器,请使用Zend\Mvc\Controller\AbstractControllerZend\Stdlib\DispatchableInterface。据我了解您的问题,您正在寻找其中一个标识符。

      NB。意识到总是另一个目标可以触发事件管理器内的事件。因此,如果您使用$controller = $e->getTarget()依赖控制器,请始终检查此目标是否为DispatchableInterface的实例!