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所说的示例: