2015-04-23 21 views
1

我在我的服务中引发了异常。如何显示由没有错误模板的异常引发的flashMessage

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

$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()); 
    } 
} 

,与此代码我怎么能留在同一页面里异常被提出。我无法显示每个例外的错误/模板,我必须让我的用户在同一页面上进行confort。

这个问题是这样的一个的以下部分:

Handle Exception in ZF2

回答

1

您可以侦听特定的错误;如果找到,您可以重定向到同一页面以显示Flash消息。

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(); 
} 
+0

谢谢你,这真的很好;我不能这样做,因为每一个动作都会引发一个异常,它太重了,还有很多重复的代码。你有没有想法让这个更高效? – Hooli

+0

@Hooli我已更新,虽然我没有办法测试这个,所以如果它能正常工作,我会感兴趣。 – AlexP

+0

好吧,我会给你一个关于这个promis的反馈。 – Hooli

相关问题