2010-04-27 35 views
10

Zend_Controller_Plugin_ErrorHandler siempre reenvía a ErrorController :: errorAction() en el módulo predeterminado, pero quiero que sea compatible con el módulo. Por ejemplo, cuando se lanza una excepción, debe llamar al ErrorController del módulo, como Admin_ErrorController: errorAction.Zend Framework Module error handling

¿Cómo puedo hacer esto? Gracias.

Respuesta

23

Puede crear plug-in que examinará su solicitud y en base a módulo actual establece 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()); 
     } 
    } 
} 

A continuación, utilice

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

para registrar el plugin con el FrontController. Gracias JohnP por señalar eso.

+0

Puede usar $ front-> hasPlugin ($ name); – takeshin

+3

+1 funciona como un amuleto y para cualquiera que se pregunte dónde crear una instancia del complemento. poniendo 'Zend_Controller_Front :: registerPlugin (new My_Controller_Plugin_Utilities())' en tu bootstrap lo hará. – JohnP

+0

Tenga en cuenta que he actualizado el código (cambió el nombre de clase), por lo que Copiar y Pegar tendría más sentido. Era parte de mi clase de utilidades y ahora debería ser más descriptivo. –

3

El enfoque alternativo puede ser lanzar excepciones específicas para cada módulo (o funcionalidad que necesite, por ejemplo, Mymodule_MyException) y luego manejarlas en el Default_ErrorController.