ZF2事件触发器

时间:2013-05-17 12:49:08

标签: zend-framework2

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

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方法。

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

提前致谢

编辑: 这是一个宁静的控制器,如果这有任何区别(我不认为它)。

1 个答案:

答案 0 :(得分:9)

问题在于您将侦听器附加到ModuleManager EventManager实例,而不是主Application EventManager。

无法直接从模块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);
               }
        );
    }
}