4

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

目前我的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()
));

所以它应该EventManager和我从服务定位器接收它并将它注入控制器一样。我仍然没有得到任何输出。我也尝试$e->getApplication()->getEventManager()在附加到事件时使用,但这只会给我 ZF 内部事件。

我读到了SharedEventManager,但我不完全理解为什么我应该传递一个上下文。我像这样尝试过(据我所知),但仍然没有输出。

$e->getApplication()->getServiceManager()->get('EventManager')
    ->getSharedManager()
    ->attach('finishedAction', '*', function() { ... });

那么,我做错了什么?我只想触发事件并在可能不同的模块中捕获它们,但它似乎变得如此复杂......

4

2 回答 2

4

默认情况下EventManager服务是不共享的,这意味着每次你调用$serviceLocator->get('EventManager')你都会得到一个不同的实例,这就是你应该使用的原因SharedEventManager- 查看@Crisp的链接以了解如何使用它。

另一个提示:不要试图在你的对象中注入 Mvc EventManager,每个对象都应该触发它们自己的事件。

于 2013-05-02T07:23:55.553 回答
0

以下对我有用(不是 getEventManager 和 getSharedManager 的顺序),还要注意事件名称和上下文(或标识符)的顺序。

$e->getApplication()->getEventManager()->getSharedManager()->attach('*', 'finishedAction', function() { ... });

问候!

于 2015-11-05T20:21:21.250 回答