我实现了一个共享事件监听器,它操纵并返回响应对象,并带有一个错误模板,显示触发错误代码的消息。 (我不是在讨论抛出异常并在dispatch.error监听器中捕获它们!)
当我在控制器动作中调用此事件时,这可以正常工作。但是,当我在控制器的onDispatch方法中调用的控制器插件中触发我的错误事件时,只能正确设置状态代码。但被调用的操作已完全执行,并且未显示错误页面。
我完全不知道为什么会发生这种情况,我希望有人能够在这里向我解释调度/事件触发/短路/返回响应问题。
以下摘录可能会让您对我的代码有一个印象:
监听器:
class SharedErrorListener implements SharedListenerAggregateInterface {
...
public myErrorFunction(EventInterface $e) {
// get error code
// set status code to injected response object
// add error template to injected view model
// return response
}
}
随机控制器动作(工作正常):
return $this->getEventManager()->trigger('error', $this, array(
'errorCode' => my_error_code
));
控制器的onDispatch():
// call plugin, if return value given return it (response must be returned?!).
$r= $this->plugin('myplugin')->doIt();
if (isset($r)) {
return $r;
}
类myplugin doIt(),其中触发错误,但错误模板未显示:
return $this->getController()->getEventManager()->trigger('error', $this, array(
'errorCode' => my_error_code
));
由于控制器和控制器插件中的代码几乎相同,我认为它必须依赖于某些应用程序状态。我做了很多研究,但找不到,问题可能是什么。但是,由于事件被正确触发并且正确的状态代码被设置为响应,我只是非常困惑。我不想实现ErrorController(允许调用重定向),因为我认为通过EventManager的解决方案实际上非常好。
答案 0 :(得分:1)
我太忙了,无法真正阅读以上所有内容,但从我的印象来看,这段代码剪切实际上可能会帮助你:
$trigger = $this->getEventManager()->trigger(self::EVENT_IDENTITY_GET, $identity);
if ($trigger instanceof ResponseCollection && !is_null($trigger->last())) {
return $trigger->last();
}
答案 1 :(得分:0)
我终于在这里找到了问题。通过在onDispatch进程期间返回响应,未调用AbstractActionController的onDispatch()。在该函数中,控制器动作的返回值,例如,视图模型,被设置为MvcEvent的“结果”。我只需要设置在侦听器中设置的模板作为事件的结果:
$r = $this->plugin('my_plugin')->doIt();
if ($r instanceof ResponseCollection) {
$e->setResult($this->getServiceLocator()->get('view_manager')->getViewModel()->getChildren());
return $r;
}
希望这有助于某人。