我在触发事件时遇到问题。这是我的代码...
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/