2010-06-10 5 views
0

J'ai quelques modules, l'un est une API. Je veux définir un ErrorHandler différent pour ce module d'API. Parce que lorsque ErrorHandler par défaut est déclenché, il utilise le module par défaut avec la mise en page par défaut, qui contient du HTML.Définir un errorhandler différent en fonction du module - Zend Framework

Ce qui est quelque chose que je ne veux pas que mon API retourne.

J'ai regardé ici et chez Zend Docs et n'ai rien trouvé qui me permette de le faire.

Merci pour toute aide.

Répondre

4

Voici celui que j'utilise: (. BTW, cette question qui a déjà été discuté ici, regardez attentivement)

<?php 
class My_Controller_Plugin_Modular_ErrorController extends Zend_Controller_Plugin_Abstract 
{ 
    public function routeShutdown (Zend_Controller_Request_Abstract $request) 
    { 
     $front = Zend_Controller_Front::getInstance(); 

     // Front controller has error handler plugin 
     // if the request is an error request. 
     // If the error handler plugin is not registered, 
     // we will be unable which MCA to run, so do not continue. 
     $errorHandlerClass = 'Zend_Controller_Plugin_ErrorHandler'; 
     if (!$front->hasPlugin($errorHandlerClass)) { 

      return false; 
     } 

     // Determine new error controller module_ErrorController_ErrorAction 
     $plugin = $front->getPlugin($errorHandlerClass); 
     $errorController = $plugin->getErrorHandlerController(); 
     $errorAaction = $plugin->getErrorHandlerAction(); 
     $module = $request->getModuleName(); 

     // Create test request module_ErrorController_ErrorAction... 
     $testRequest = new Zend_Controller_Request_Http(); 
     $testRequest->setModuleName($module) 
      ->setControllerName($errorController) 
      ->setActionName($errorAaction); 

     // Set new error controller if available 
     if ($front->getDispatcher()->isDispatchable($testRequest)) { 
      $plugin->setErrorHandlerModule($module); 
     } else { 

      return false; 
     } 

     return true; 
    } 
} 

+0

Génial, merci! –

0

Juste au-dessus de ma tête, vous pouvez stocker une copie de l'objet de demande d'origine dans le registre à partir d'un plugin de contrôleur. Dans le preDispatch() de votre contrôleur, vous pouvez alors transférer vers un autre contrôleur d'erreur basé sur le module demandé.

// Plugin 
public function routeStartup(Zend_Controller_Request_Abstract $request) 
{ 
    $clonedRequest = clone $request; 
    Zend_Registry::set('originalRequest', $clonedRequest); 
} 

// ErrorController 
public function preDispatch() 
{ 
    $request = Zend_Registry::get('originalRequest'); 
    $this->_forward('error', 'error', $request->getModuleName()); 
} 
1

@takeshin: Merci de partager votre plugin, cette c'est génial! Et juste la chose que je cherchais sur la machine Google. J'ai apporté quelques modifications, respectueusement, à la logique qui détermine la demande d'être une "demande d'erreur", puisque j'ai trouvé que le rappel du plugin complet était en cours d'exécution à chaque requête, qu'une erreur soit survenue ou non.

Je viens de changer le hook du plugin en "postDispatch" et j'ai testé qu'une exception s'était réellement produite pendant l'expédition. Le reste du code fonctionne exactement comme le vôtre.

Maintenant, vous pouvez placer une instruction die au milieu du plugin, et vous ne la verrez qu'après une exception lors de la requête.

<?php 
class Rm_Controller_Plugin_Modular_ErrorController 
    extends Zend_Controller_Plugin_Abstract 
{ 
    public function postDispatch(Zend_Controller_Request_Abstract $request) 
    { 
     $front = Zend_Controller_Front::getInstance(); 

     // true if response has any exception 
     $isError = $front->getResponse()->hasExceptionOfType('Exception'); 

     // if there was no error during dispatch 
     if (!$isError) { 
      return false; 
     } 

     // standard error handler plugin class name 
     $errorHandlerClass = 'Zend_Controller_Plugin_ErrorHandler'; 

     // if the error handler plugin is not registered, do not continue. 
     if (!$front->hasPlugin($errorHandlerClass)) { 
      return false; 
     } 

     $plugin = $front->getPlugin($errorHandlerClass); 

     // the module that was requested and threw error 
     $module = $request->getModuleName(); 

     // the controller & action name that error handler will dispatch 
     $errorController = $plugin->getErrorHandlerController(); 
     $errorAction = $plugin->getErrorHandlerAction(); 

     // create a dummy request to test for dispatchablility 
     $testRequest = new Zend_Controller_Request_Http(); 
     $testRequest->setModuleName($module) 
      ->setControllerName($errorController) 
      ->setActionName($errorAction); 

     // verify that the current module has defined an ErrorController::errorAction 
     if ($front->getDispatcher()->isDispatchable($testRequest)) { 
      // tell error controller plugin to use the module's error controller 
      $plugin->setErrorHandlerModule($module); 
     } else { 
      return false; 
     } 

     return true; 
    } 
} 
Questions connexes