Events 事件管理器与wilcard连接

Events 事件管理器与wilcard连接,events,zend-framework2,Events,Zend Framework2,要将新事件附加到侦听器,我使用如下代码,并且效果良好: class Listener implements ListenerAggregateInterface { /** * @var \Zend\Stdlib\CallbackHandler[] */ protected $listeners = array(); /** * {@inheritDoc} */ public function attach(EventMa

要将新事件附加到侦听器,我使用如下代码,并且效果良好:

class Listener implements ListenerAggregateInterface
{
    /**
     * @var \Zend\Stdlib\CallbackHandler[]
     */
    protected $listeners = array();

    /**
     * {@inheritDoc}
     */
    public function attach(EventManagerInterface $events)
    {
        $sharedEvents      = $events->getSharedManager();

        $this->listeners[] = $sharedEvents->attach('*', '*', array($this, 'log'));
    }

    public function detach(EventManagerInterface $events)
    {
        foreach ($this->listeners as $index => $listener) {
            if ($events->detach($listener)) {
                unset($this->listeners[$index]);
            }
        }
    }

    public function log($event)
    {
        // Log  feature here
    }
}
我只想关联一些操作,而不是“*”,例如关联以“.post”结尾的操作,类似这样:

(...)
$this->listeners[] = $sharedEvents->attach('*', '*.post', array($this, 'log'));
(...)
public function log($event)
{

    // Get event name
    $eventName = $event->getName();

    // Perform any string comparison you like here
    if($eventName === 'register'){ 

        // Do something
    }
}

但是不行,我怎么能做那样的事?(为了避免听所有的动作)

简而言之,你不能

但是,您可以通过将事件名称数组交给attach方法来侦听多个事件,例如

$this->listeners[] = $sharedEvents->attach('*', 
    array('register.post', 'edit.post', 'create.post'), 
    array($this, 'log')
);

您可以使用通配符侦听器侦听日志函数中的
*
并按事件名称进行筛选,如下所示:

(...)
$this->listeners[] = $sharedEvents->attach('*', '*.post', array($this, 'log'));
(...)
public function log($event)
{

    // Get event name
    $eventName = $event->getName();

    // Perform any string comparison you like here
    if($eventName === 'register'){ 

        // Do something
    }
}
您还可以在GitHub上查看我的zf2事件记录器模块代码,了解更多代码:


我建议在侦听所有事件时要小心,有些事件可能会返回响应,而在这种情况下返回void或其他意外值的侦听器可能会导致不可预测的结果/错误。(从这里的经验来看:-D)嗨,克里斯普,你能详细说明一下并举个例子吗?谢谢@jurgen vand de moere将
模块管理员:::事件加载模块解析
loadModuleByName
此处触发的事件->。如您所见,它期望侦听器返回模块对象实例,并且集合中的最后一个结果将是模块实例。如果您附加了一个侦听器,该侦听器在实际的
ModuleResolverListener
之后触发,则最后的结果将不是模块,而是侦听器返回的任何内容,从而导致
模块无法初始化
异常。@Crisp所说的示例: