2015-04-23 33 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

相關問題