Php 如何使用ZF2';是否在多个类(和模块)上运行EventManager?
我有以下设置:在一个控制器中,我触发一个事件,我想在其他地方将多个侦听器连接到它 目前,我的onBootstrap中有以下侦听器:Php 如何使用ZF2';是否在多个类(和模块)上运行EventManager?,php,zend-framework2,Php,Zend Framework2,我有以下设置:在一个控制器中,我触发一个事件,我想在其他地方将多个侦听器连接到它 目前,我的onBootstrap中有以下侦听器: $e->getApplication()->getServiceManager()->get('EventManager')->attach('*', function($e) { var_dump($e->getName()); }); 'Application\Controller\Foo' => function(
$e->getApplication()->getServiceManager()->get('EventManager')->attach('*', function($e) {
var_dump($e->getName());
});
'Application\Controller\Foo' => function(ControllerManager $cm) {
$eventManager = $cm->getServiceLocator()->get('EventManager');
$controller = new \Application\Controller\FooController();
$controller->setEventManager($eventManager);
return $controller;
},
$this->getEventManager()->trigger('foo-finished', 'finishedAction', array(
'obj' => $foo->someObject()
));
以下代码段作为工厂:
$e->getApplication()->getServiceManager()->get('EventManager')->attach('*', function($e) {
var_dump($e->getName());
});
'Application\Controller\Foo' => function(ControllerManager $cm) {
$eventManager = $cm->getServiceLocator()->get('EventManager');
$controller = new \Application\Controller\FooController();
$controller->setEventManager($eventManager);
return $controller;
},
$this->getEventManager()->trigger('foo-finished', 'finishedAction', array(
'obj' => $foo->someObject()
));
最后是我的控制器中的以下触发器:
$e->getApplication()->getServiceManager()->get('EventManager')->attach('*', function($e) {
var_dump($e->getName());
});
'Application\Controller\Foo' => function(ControllerManager $cm) {
$eventManager = $cm->getServiceLocator()->get('EventManager');
$controller = new \Application\Controller\FooController();
$controller->setEventManager($eventManager);
return $controller;
},
$this->getEventManager()->trigger('foo-finished', 'finishedAction', array(
'obj' => $foo->someObject()
));
因此,当我从服务定位器接收到它并将其注入控制器时,它应该与EventManager相同。我仍然没有得到任何输出。我还尝试在附加到事件时使用$e->getApplication()->getEventManager()
,但这只提供了ZF内部事件
我阅读了有关SharedEventManager的内容,但我不完全理解为什么要传递上下文。我像这样试过(这是我的理解),但仍然没有输出
$e->getApplication()->getServiceManager()->get('EventManager')
->getSharedManager()
->attach('finishedAction', '*', function() { ... });
那么,我做错了什么?我只想触发事件并在可能不同的模块中捕获它们,但它似乎变得如此复杂…默认情况下,
EventManager
服务不共享,这意味着每次调用$serviceLocator->get('EventManager')
时,您都会得到不同的实例,这就是为什么你应该使用SharedEventManager
——看看@Crisp的用法
还有一个提示:不要尝试在对象中插入Mvc EventManager,每个对象都应该触发它们自己的事件。以下内容对我很有用(不是getEventManager和getSharedManager的顺序),还要注意事件名和上下文(或标识符)的顺序
问候 有关示例,请参见此处的答案->