7

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

控制器.php

function get($id) 
{
    $this->getEventManager()->trigger('hmac.check');
}

运行此触发器时,即使已附加,它也不会运行 hmac.check 事件。

模块.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 方法。

对此的任何帮助都会很棒。

提前致谢

编辑:这是一个安静的控制器,如果这有什么不同的话(我认为没有)。

4

1 回答 1

9

问题是您将侦听器附加到ModuleManagersEventManager实例,而不是主ApplicationEventManager。

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

hmac.check这是一个通过在由任何扩展控制器触发时侦听事件来执行此操作的示例Zend\Mvc\Controller\AbstractRestfulController,但是您可以通过将其替换为控制器 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);
               }
        );
    }
}
于 2013-05-17T13:26:56.357 回答