如何在没有错误模板的情况下显示由异常引发的 flashMessage
How to show a flashMessage raised by an exception without the error template
我的服务出现异常。
此异常由附加的侦听器处理:
$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());
}
}
现在,使用此代码我如何才能停留在引发异常的同一页面。我无法在每个异常中显示 error/template,我必须让我的用户保持在同一页面上以保持舒适。
这个问题是这个问题的以下部分:
您可以侦听特定错误;如果找到,您可以重定向回同一页面以显示闪现消息。
ZF2 目前使用 Zend\Mvc\View\Http\RouteNotFoundStrategy
来处理 404 错误,Zend\Mvc\View\Http\ExceptionStrategy
处理一般异常;因此您需要为您的事件附加 更高 优先级(比 1
),以便它们首先执行。
您应该更改控制器代码(来自您的原始问题)以将异常添加到 MVC 事件并手动触发调度错误。
编辑 如果您想减少代码,the dispatch listener does handle exceptions from the controller by triggering the MvcEvent::EVENT_DISPATCH_ERROR
for you。我没有对此进行测试,但是你 应该 能够侦听自定义异常,同样前提是你的事件优先级高于 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();
}
我的服务出现异常。
此异常由附加的侦听器处理:
$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());
}
}
现在,使用此代码我如何才能停留在引发异常的同一页面。我无法在每个异常中显示 error/template,我必须让我的用户保持在同一页面上以保持舒适。
这个问题是这个问题的以下部分:
您可以侦听特定错误;如果找到,您可以重定向回同一页面以显示闪现消息。
ZF2 目前使用 Zend\Mvc\View\Http\RouteNotFoundStrategy
来处理 404 错误,Zend\Mvc\View\Http\ExceptionStrategy
处理一般异常;因此您需要为您的事件附加 更高 优先级(比 1
),以便它们首先执行。
您应该更改控制器代码(来自您的原始问题)以将异常添加到 MVC 事件并手动触发调度错误。
编辑 如果您想减少代码,the dispatch listener does handle exceptions from the controller by triggering the MvcEvent::EVENT_DISPATCH_ERROR
for you。我没有对此进行测试,但是你 应该 能够侦听自定义异常,同样前提是你的事件优先级高于 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();
}