2010-04-27 7 views
10

Zend_Controller_Plugin_ErrorHandler leitet immer an ErrorController :: errorAction() im Standardmodul weiter, aber ich möchte, dass es modulbewusst ist. Wenn zum Beispiel eine Ausnahme ausgelöst wird, muss der ErrorController des Moduls wie Admin_ErrorController aufgerufen werden: errorAction.Zend Framework Modul basierte Fehlerbehandlung

Wie kann ich das tun? Danke.

Antwort

23

Sie Plugin erstellen können, die Ihre Anfrage auf aktuellen Modul setzt Errorcontroller untersuchen wird und basiert ...

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

Dann

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

das Plugin mit dem Frontcontroller zu registrieren. Danke, JohnP, dass du das gezeigt hast.

+0

Sie können $ front-> hasPlugin ($ name); – takeshin

+3

+1 funktioniert wie ein Zauber und für jeden, der sich fragt, wo das Plugin instanziiert werden soll. Putting 'Zend_Controller_Front :: registerPlugin (neue My_Controller_Plugin_Utilities())' in Ihrem Bootstrap wird es tun. – JohnP

+0

Bitte beachten Sie, dass ich den Code aktualisiert (den Klassennamen geändert) habe, so dass Copy & Paste mehr Sinn machen würde. Es war Teil meiner Utilities-Klasse und sollte nun beschreibender sein. –

3

Alternativer Ansatz kann sein, bestimmte Ausnahmen für jedes Modul (oder Funktionalität, die Sie benötigen, z. B. Mymodule_MyException) zu werfen und dann in der zu behandeln.