如何显示一个异常引起了flashMessage没有错误模板(How to show a flashM

2019-10-22 18:39发布

我在我的服务提出了一个例外。

此异常是由连接监听器处理:

$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

Answer 1:

您可以侦听特定的错误; 如果被发现你就可以重定向到同一页面显示提示信息。

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