Zend framework2 ZF2事件触发器
我在触发事件时遇到问题。这是我的密码 controller.phpZend framework2 ZF2事件触发器,zend-framework2,Zend Framework2,我在触发事件时遇到问题。这是我的密码 controller.php function get($id) { $this->getEventManager()->trigger('hmac.check'); } 运行此触发器时,即使已连接,也不会运行hmac.check事件 module.php class Module { /** * Init the methods * * @param ModuleManager $moduleM
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方法
这方面的任何帮助都会很好
提前谢谢
编辑:
这是一个restful控制器,如果这有什么区别的话(我不认为有什么区别)。问题是您将侦听器附加到
ModuleManager
sEventManager
实例,而不是主应用程序
EventManager
无法直接从模块init()附加到应用程序EventManager,模块管理器无权访问它,因此您需要从模块管理器的EventManager获取SharedManager并将事件侦听器附加到该应用程序EventManager
下面是一个这样做的示例,当任何扩展了Zend\Mvc\controller\AbstractRestfulController
的控制器触发hmac.check
事件时,您可以通过将其替换为控制器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);
}
);
}
}
你是怎么做到的?我得到了以下错误:传递给闭包的参数1必须是Zend\Mvc\MvcEvent的实例,Zend\ModuleManager\ModuleEvent的实例given@emolah,如果您得到一个ModuleEvent实例,我只能假设您复制了问题中使用的代码,而不是答案中给出的代码。有没有办法做同样的事情,但不将其连接到特定的控制器?比如,也许每个控制器都能触发这个事件?@ChristopherFrancisco如果你看一下答案,它会监听所有扩展AbstractRestfulController类的类,而不是特定的控制器类。您可以同样轻松地将其替换为
Zend\Mvc\Controller\AbstractActionController
,并监听所有动作控制器实例(假设您的动作控制器遵循正常的ZF2约定并扩展AbstractActionController)。