我在我的服务提出了一个例外。
此异常是由连接监听器处理:
$this->listeners[] = $events->attach(MvcEvent::EVENT_RENDER_ERROR, array($this, 'handleException'));
$this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH_ERROR, array($this, 'handleException'));
处理异常被设计成flashMessage:
public function handleException(MvcEvent $event)
{
$exception = $event->getParam('exception');
if ($exception) {
$flashMessenger = new FlashMessenger();
$flashMessenger->setNamespace('danger');
$flashMessenger->addMessage($exception->getMessage());
$event->getViewModel()->setVariable('flashMessages', $flashMessenger->getMessages());
}
}
现在,有了这个代码,我怎样才能留到异常引发的同一页面。 我不能显示在每个异常的错误/模板,我要保持我的用户提供舒适在同一页上。
这个问题是这样的一个的以下部分:
处理异常在ZF2
您可以侦听特定的错误; 如果被发现你就可以重定向到同一页面显示提示信息。
ZF2目前正与这是否Zend\Mvc\View\Http\RouteNotFoundStrategy
,404错误和Zend\Mvc\View\Http\ExceptionStrategy
仿制例外; 所以你需要附上事件的优先级较高 (大于1
),所以它们首先被执行。
你应该改变控制器代码(从原来的问题)将异常添加到MVC事件和手动触发调度错误。
编辑如果你想减少代码, 调度听者确实通过触发处理来自控制器例外MvcEvent::EVENT_DISPATCH_ERROR
你 。 我没有测试这个但是你应该能够听一个自定义异常,再次为您提供有一个事件的优先级高于1
。
public function fooAction()
{
try {
throw new \Exception('A error occurred');
} catch (\Exception $e) {
// Throw a custom exception
throw new MyCustomException('Some error');
}
}
事件监听器现在可以检查这一点,并处理重定向。
public function handleException(\Zend\Mvc\MvcEvent $event)
{
$error = $event->getError();
$exception = $event->getParam('exception');
if (! $error || ! $exception instanceof MyCustomException) {
return;
}
$serviceManager = $event->getApplication()->getServiceManager();
$controllerPluginManager = $serviceManager->get('ControllerPluginManager');
$flashMessenger = $controllerPluginManager->get('FlashMessenger');
$flashMessenger->setNamespace('danger');
$flashMessenger->addMessage($exception->getMessage());
return $controllerPluginManager->get('redirect')->refresh();
}
文章来源: How to show a flashMessage raised by an exception without the error template