Zend Framework 2 事件管理器

Zend Framework 2 Event Manager

我正在学习 zf2 事件,下面是我的代码:

module.php

 public function init(ModuleManagerInterface $managers) {       
    $eventManager = $managers->getEventManager();
    /* $eventManager->attach('do', array($this, function ($e) {
        $event = $e->getName();
        $params = $e->getParams();
        printf(
                'Handled event "%s", with parameters %s',
                $event,
                json_encode($params)
                );
        })
    ); */

    $eventManager->attach('do', array($this, 'demoEvent') );

}
public function demoEvent(Event $e) {
    echo  ' in demo Event';
}

并且在控制器函数中我触发了事件。

 $this->getEventManager()->trigger('do', $this, ['aman', 'deep']);

但从未调用 demoEvent 操作。正如您在上面看到的那样,即使我尝试使用闭包,但它给了我 "Invalid callback provided" 异常。

我做错了什么。有人可以帮助我更好地理解事件管理器。谢谢

您的方法几乎是正确的。问题是您将事件侦听器 "demoEvent" 附加到 application 事件管理器,而不是 controller 的事件管理器。

作为控制器,假设它扩展了 AbstractActionController,也将能够触发它自己的事件。

因此,您需要更新附加侦听器的方式,以确保它已在正确的事件管理器中注册。

有几个选项。

  • 在控制器工厂内附加事件侦听器。您可以在工厂内部调用 $controller->getEventManager()->attach();,以便在创建控制器时始终附加事件侦听器。

  • 覆盖 AbstractActionController 中定义的 attachDefaultListeners() 这将在控制器管理器初始化控制器时自动调用。这提供了对控制器事件管理器的访问,请务必记住调用 parent::attachDefaultListeners()

  • 最后,您可以使用 "Shared Event Manager",它实际上只是目标事件管理器的代理(尽管它的名字不是事件管理器)。这允许您仅稍微修改您编写的代码并保持事件侦听器注册独立于触发上下文(控制器)。

例如

class Module
{

    public function onBootstrap(MvcEvent $mvcEvent)
    {
        $sharedManager = $mvcEvent->getEventManager()->getSharedManager();

        $sharedManager->attach(
            'Foo\Controller\BarController', // Event manager 'identifier', which one we want
            'do'                    // Name of event to listen to
            [$this, 'demoEvent'],   // The event listener to trigger
            1,                      // event priority 
        );
    }

    public function demoEvent($event)
    {

    }

}