Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework2 在控制器插件中触发时,返回事件侦听器中的响应对象不工作_Zend Framework2 - Fatal编程技术网

Zend framework2 在控制器插件中触发时,返回事件侦听器中的响应对象不工作

Zend framework2 在控制器插件中触发时,返回事件侦听器中的响应对象不工作,zend-framework2,Zend Framework2,我实现了一个共享事件侦听器,该侦听器操作并返回响应对象,其中包含一个错误模板,显示触发的错误代码的消息。(我不是说抛出异常并在dispatch.error侦听器中捕获它们!) 当我在控制器操作中调用此事件时,这可以正常工作。但是,当我在控制器的onDispatch方法中调用的控制器插件中触发错误事件时,只有状态代码设置正确。但是被调用的操作被完全执行,并且没有显示错误页面 我完全不知道为什么会发生这种情况,我希望有人能在这里向我解释调度/事件触发/短路/返回响应问题 以下摘录可能会给您留下我的代

我实现了一个共享事件侦听器,该侦听器操作并返回响应对象,其中包含一个错误模板,显示触发的错误代码的消息。(我不是说抛出异常并在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
  }
}
随机控制器动作(工作正常):

控制器的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的解决方案实际上非常好。

我太忙了,无法真正阅读上述内容,但从我的印象来看,截取的这段代码实际上可能会帮助您:

$trigger = $this->getEventManager()->trigger(self::EVENT_IDENTITY_GET, $identity);
if ($trigger instanceof ResponseCollection && !is_null($trigger->last())) {
    return $trigger->last();
}

我终于在这里找到了问题。通过在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;
}

希望这对某人有所帮助。

谢谢您的回复,非常感谢。我确实没有意识到我返回的是ResponseCollection而不是Response的实例。但是,如果我在操作中使用此代码,我只会收到一个空白页面(它可以返回ResponseCollection),控制器插件中也会发生同样的情况。但尽管如此,这是一个很好的提示,我会深入研究,谢谢!
$r = $this->plugin('my_plugin')->doIt();

if ($r instanceof ResponseCollection) {
  $e->setResult($this->getServiceLocator()->get('view_manager')->getViewModel()->getChildren());
  return $r;
}