事件管理器附加通配符

时间:2013-06-17 15:36:29

标签: events zend-framework2

要将新事件附加到侦听器,我使用如下代码并正常工作:

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'));
(...)

但是不起作用,我怎么能这样做呢? (为避免听取所有行动)

2 个答案:

答案 0 :(得分:1)

简短的回答是你不能。

然而,您可以通过将attach方法的一系列事件名称交给多个事件来监听,例如..

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

答案 1 :(得分:1)

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

public function log($event)
{

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

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

        // Do something
    }
}

您还可以在GitHub上查看我的zf2-event-logger模块代码以获取更多代码:

https://github.com/jvandemo/zf2-event-logger