Php Zend Framework 2事件管理器

Php Zend Framework 2事件管理器,php,events,zend-framework2,Php,Events,Zend Framework2,我正在学习zf2事件,下面是我的代码: module.php public function init(ModuleManagerInterface $managers) { $eventManager = $managers->getEventManager(); /* $eventManager->attach('do', array($this, function ($e) { $event = $e->getName()

我正在学习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采取行动。正如你们在上面看到的,我甚至尝试过使用闭包,但它给了我“提供的回调无效”的异常


我做错了什么。有人能帮助我更好地理解活动经理吗。谢谢你,你的方法几乎是正确的。问题是您正在将事件侦听器“demoEvent”附加到应用程序事件管理器,而不是控制器的事件管理器

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

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

有几个选择

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

  • 重写在
    AbstractActionController
    中定义的
    attachDefaultListeners()
    ,当控制器管理器初始化控制器时,将自动调用该函数。这提供了对控制器事件管理器的访问,只需记住调用
    parent::attachDefaultListeners()

  • 最后,您可以使用“共享事件管理器”,它实际上只是目标事件管理器的代理(尽管名称不同,但不是事件管理器)。这只允许您稍微修改已编写的代码,并使事件侦听器注册独立于触发上下文(控制器)

比如说

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)
    {

    }

}

尝试了前两种方法,效果很好。但是,既然有不同的事件管理器,比如控制器,应用程序,那么如何知道他正在将侦听器连接到正确的事件管理器呢?你能给我提供一些链接或任何我可以从中了解更多关于事件管理器的信息。到目前为止,还没有找到任何关于EM的好文档。无论如何,感谢您提供了详细的答案。在事件管理器类中有一个“标识符”数组,它存储了许多您可以引用的名称。默认情况下使用了实现的
\uuuuu类\uuuuuu
常量,因此我的答案应该是
Foo\Controller\BarController
,这样它才能工作。退房,也在酒店内。