实施新的ZF2应用程序我发现自己在使用EventManager。在应用程序模块中,我创建了AuthenticationListener
和NotifierListener
。第一个检查用户的正确身份验证,第二个检查发送给登录用户的自定义消息。
现在我正在创建一个新模块,用于调度要导出的xml文件。我想保留AuthenticationListener
,但要分离NotifierListener
以避免E_NOTIFY
错误。问题是,在阅读博客/源代码/文档(相当差)并拔掉我的头发后,我无法理解如何分离上面提到的听众。
public function onBootstrap($e)
{
$eventManager = $e->getApplication()->getEventManager();
$authListener = new AuthenticationListener();
$authListener->attach($eventManager);
$notifyListener = new NotifyListener();
$notifyListener->attach($eventManager);
}
public function onBootstrap($e)
{
$eventManager = $e->getApplication()->getEventManager();
// ... $eventmanager->detach('NotifyListener');
}
答案 0 :(得分:3)
答案是让你的听众服务
因为它不需要构造函数params,所以它是可调用的,所以在invokables数组中设置它
public function getServiceConfig()
{
return array(
'invokables' => array(
'NotifyListener' => 'FQCN\To\NotifyListener',
),
);
}
从服务管理器获取它,而不是直接在引导程序中创建新实例
public function onBootstrap($e)
{
$eventManager = $e->getApplication()->getEventManager();
$sm = $e->getApplication()->getServiceManager();
$notifyListener = $sm->get('NotifyListener')
$notifyListener->attach($eventManager);
}
您想要分离它的任何地方,您只需要能够访问ServiceManager
// in any ServiceLocator aware class
$sm = $this->getServiceLocator();
$eventManager = $sm->get('Application')->getEventManager();
$notifyListener = $sm->get('NotifyListener');
$notifyListener->detach($eventManager);
答案 1 :(得分:0)
你走在正确的道路上。您唯一需要做的就是在detach()
上拨打NotifyListener
,而不是EvenManager
。下面的示例来自EventManager
的Zend Framework手册。
link:http://framework.zend.com/manual/2.0/en/modules/zend.event-manager.event-manager.html#examples
use Zend\Cache\Cache;
use Zend\EventManager\EventCollection;
use Zend\EventManager\ListenerAggregateInterface;
use Zend\EventManager\EventInterface;
class CacheListener implements ListenerAggregateInterface
{
protected $cache;
protected $listeners = array();
public function __construct(Cache $cache)
{
$this->cache = $cache;
}
public function attach(EventCollection $events)
{
$this->listeners[] = $events->attach('get.pre', array($this, 'load'), 100);
$this->listeners[] = $events->attach('get.post', array($this, 'save'), -100);
}
public function detach(EventManagerInterface $events)
{
foreach ($this->listeners as $index => $listener) {
if ($events->detach($listener)) {
unset($this->listeners[$index]);
}
}
}
public function load(EventInterface $e)
{
// some code to load
}
public function save(EventInterface $e)
{
// some code to save
}
}
此示例非常清楚地说明了如何准备实现AuthenticationListener
的侦听器(例如ListenerAggregateInterface
)。
假设与Module
对象的情况相同:
public function onBootstrap($e)
{
$eventManager = $e->getApplication()->getEventManager();
$cacheListener = new CacheListener($cache);
$cacheListener->detach($eventManager);
}
因此,假设您的NotifyListener
实现ListenerAggregateInterface
或只是使用detach()
方法,您可以编写onBootstrap()
方法来分离监听器,如下所示:
public function onBootstrap($e)
{
$eventManager = $e->getApplication()->getEventManager();
$notifyListener = new NotifyListener();
$notifyListener->detach($eventManager);
}
希望这会有所帮助,反馈将不胜感激:)
斯托