我遇到触发事件的问题。这是我的代码......
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方法。
对此的任何帮助都会很棒。
提前致谢
编辑: 这是一个宁静的控制器,如果这有任何区别(我不认为它)。
答案 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);
}
);
}
}