【问题标题】:How to use ZF2's EventManager over multiple classes (and modules)?如何在多个类(和模块)上使用 ZF2 的 EventManager?
【发布时间】:2013-05-01 13:41:05
【问题描述】:

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

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

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

【问题讨论】:

标签: php zend-framework2


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    问候!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 2017-07-26
      • 2014-07-07
      • 2012-08-17
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      相关资源
      最近更新 更多