Zend framework2 ZF2事件触发器

Zend framework2 ZF2事件触发器,zend-framework2,Zend Framework2,我在触发事件时遇到问题。这是我的密码 controller.php function get($id) { $this->getEventManager()->trigger('hmac.check'); } 运行此触发器时,即使已连接,也不会运行hmac.check事件 module.php class Module { /** * Init the methods * * @param ModuleManager $moduleM

我在触发事件时遇到问题。这是我的密码

controller.php

function get($id) 
{
    $this->getEventManager()->trigger('hmac.check');
}
运行此触发器时,即使已连接,也不会运行hmac.check事件

module.php

class Module
{
    /**
     * Init the methods
     *
     * @param ModuleManager $moduleManager
     */
    public function init(ModuleManager $mm)
    {
        $mm->getEventManager()
           ->attach(
               'hmac.check',
               function(MvcEvent $evt)
               {
                   echo "The trigger has worked";
                   $key = $evt->getParams()->fromHeader('key');
                   $ts = $evt->getParams()->fromHeader('when');
                   $uri = $evt->getParams()->fromHeader('uri');

                   $hmac = new \Scc\Hmac\Hmac(new HmacConfig, new HmacStorage);
               }
        );
    }
}
如果我在$mm->getEventManager->attach()之前或之后回显消息;它显示测试结果,因此我知道它正在执行init方法

这方面的任何帮助都会很好

提前谢谢

编辑:
这是一个restful控制器,如果这有什么区别的话(我不认为有什么区别)。

问题是您将侦听器附加到
ModuleManager
s
EventManager
实例,而不是主
应用程序
EventManager

无法直接从模块init()附加到应用程序EventManager,模块管理器无权访问它,因此您需要从模块管理器的EventManager获取SharedManager并将事件侦听器附加到该应用程序EventManager

下面是一个这样做的示例,当任何扩展了
Zend\Mvc\controller\AbstractRestfulController
的控制器触发
hmac.check
事件时,您可以通过将其替换为控制器FQCN来侦听特定的控制器

class Module
{
    /**
     * Init the methods
     *
     * @param ModuleManager $moduleManager
     */
    public function init(ModuleManager $mm)
    {
        $mm->getEventManager()->getSharedManager()
           ->attach(
               'Zend\Mvc\Controller\AbstractRestfulController', 'hmac.check',
               function(MvcEvent $evt)
               {
                   echo "The trigger has worked";
                   $key = $evt->getParams()->fromHeader('key');
                   $ts = $evt->getParams()->fromHeader('when');
                   $uri = $evt->getParams()->fromHeader('uri');

                   $hmac = new \Scc\Hmac\Hmac(new HmacConfig, new HmacStorage);
               }
        );
    }
}

你是怎么做到的?我得到了以下错误:传递给闭包的参数1必须是Zend\Mvc\MvcEvent的实例,Zend\ModuleManager\ModuleEvent的实例given@emolah,如果您得到一个ModuleEvent实例,我只能假设您复制了问题中使用的代码,而不是答案中给出的代码。有没有办法做同样的事情,但不将其连接到特定的控制器?比如,也许每个控制器都能触发这个事件?@ChristopherFrancisco如果你看一下答案,它会监听所有扩展AbstractRestfulController类的类,而不是特定的控制器类。您可以同样轻松地将其替换为
Zend\Mvc\Controller\AbstractActionController
,并监听所有动作控制器实例(假设您的动作控制器遵循正常的ZF2约定并扩展AbstractActionController)。