Php 如何使用ZF2';是否在多个类(和模块)上运行EventManager?

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(

我有以下设置:在一个控制器中,我触发一个事件,我想在其他地方将多个侦听器连接到它

目前,我的onBootstrap中有以下侦听器:

$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的顺序),还要注意事件名和上下文(或标识符)的顺序


问候

有关示例,请参见此处的答案->