zend-framework2 - ZF2 事件触发器

标签 zend-framework2

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

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

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

提前致谢

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

最佳答案

问题是您将监听器附加到 ModuleManager小号 EventManager实例,而不是主要的 Application事件管理器。

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

这是一个通过收听 hmac.check 来做到这一点的示例。由任何扩展 Zend\Mvc\Controller\AbstractRestfulController 的 Controller 触发的事件,但您可以通过将其替换为 Controller FQCN 来收听特定 Controller 。

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);
               }
        );
    }
}

关于zend-framework2 - ZF2 事件触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16609484/

相关文章:

permissions - ZF2 ACL -> 允许 Controller 中的所有操作

php - 如何在 zf2 的 Controller 中执行查询

translation - 如何在没有文本域的情况下使用 Zf2 翻译?

php - 从 Zend InputFilter 检索错误消息

php - 具有子路由的子域的 ZF2 路由器配置

php - 使用 ZF2 服务管理器覆盖实现

php - 如何将附加变量传递给匿名 TableGateway 方法参数?

php - ZF2/Doctrine 不允许我保存收藏

zend-form - ZF2,如何创建表单 View 助手?

logging - 如何在 Apigility ZF2 应用程序中捕获和记录所有异常?