2013-05-17 58 views
7

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

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->连接()回声出的消息;它显示测试的罚款,所以我知道它正在执行init方法。

任何帮助,这将是伟大的。

在此先感谢

编辑: 这是一个宁静的控制器如果有什么差别(我不认为它)。

回答

9

问题是,您要将侦听器附加到实例的事件中,而不是主要的Application事件管理器。

无法从模块init()直接附加到应用程序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); 
       } 
     ); 
    } 
} 
+2

谢谢,那可以工作:) – mic

+1

你是如何得到这个工作的?我得到了以下错误:传递给闭包的参数1必须是Zend \ Mvc \ MvcEvent的一个实例,Zend \ ModuleManager \ ModuleEvent的实例给出 – emolah

+1

@emolah,如果您得到一个ModuleEvent实例,我只能假设您复制了在问题中使用的代码,而不是答案中给出的代码。 – Crisp