2010-04-27 21 views
10

Zend_Controller_Plugin_ErrorHandler zawsze przekazuje do ErrorController :: errorAction() w module domyślnym, ale chcę, aby był on świadomy modułu. Na przykład, gdy wyjątek rzuca, należy wywołać moduł ErrorController modułu, taki jak Admin_ErrorController: errorAction.Obsługa błędów modułu Zend Framework

Jak mogę to zrobić? Dzięki.

Odpowiedz

23

Można stworzyć plugin, który zbada wniosek i na podstawie aktualnego modułu ustawia ErrorController ...

<?php 
class My_Controller_Plugin_ErrorControllerSwitcher extends Zend_Controller_Plugin_Abstract 
{ 
    public function routeShutdown (Zend_Controller_Request_Abstract $request) 
    { 
     $front = Zend_Controller_Front::getInstance(); 
     if (!($front->getPlugin('Zend_Controller_Plugin_ErrorHandler') instanceof Zend_Controller_Plugin_ErrorHandler)) { 
      return; 
     } 
     $error = $front->getPlugin('Zend_Controller_Plugin_ErrorHandler'); 
     $testRequest = new Zend_Controller_Request_Http(); 
     $testRequest->setModuleName($request->getModuleName()) 
        ->setControllerName($error->getErrorHandlerController()) 
        ->setActionName($error->getErrorHandlerAction()); 
     if ($front->getDispatcher()->isDispatchable($testRequest)) { 
      $error->setErrorHandlerModule($request->getModuleName()); 
     } 
    } 
} 

Następnie użyj

$front = Zend_Controller_Front::getInstance(); 
$front -> registerPlugin(new My_Controller_Plugin_ErrorControllerSwitcher()) 

zarejestrować wtyczkę z FrontController. Dziękuję JohnP za wskazanie tego.

+0

Możesz użyć $ front-> hasPlugin ($ name); – takeshin

+3

+1 działa jak czar i dla każdego, kto zastanawia się, gdzie utworzyć wtyczkę. umieszczenie 'Zend_Controller_Front :: registerPlugin (new My_Controller_Plugin_Utilities())' w twoim bootstrapzie zrobi to. – JohnP

+0

Uwaga! Zaktualizowałem kod (zmieniłem nazwę klasy), aby kopiowanie i wklejanie miały więcej sensu. Było to częścią mojej klasy narzędziowej, a teraz powinno być bardziej opisowe. –

3

Alternatywnym podejściem może być rzucenie określonych wyjątków dla każdego modułu (lub potrzebnej funkcjonalności, np. Mymodule_MyException), a następnie obsłużenie ich w Default_ErrorController.