2010-04-27 3 views
10

Zend_Controller_Plugin_ErrorHandler transmet toujours à ErrorController :: errorAction() dans le module par défaut, mais je souhaite qu'il soit sensible au module. Par exemple, lorsqu'une exception se déclenche, elle doit appeler le ErrorController du module comme Admin_ErrorController: errorAction.Traitement d'erreur basé sur un module Zend Framework

Comment puis-je faire cela? Merci.

Répondre

23

Vous pouvez créer le plugin qui examinera votre demande et en fonction du module en cours définit 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()); 
     } 
    } 
} 

Ensuite, utilisez

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

pour enregistrer le plug-in avec le FrontController. Merci à JohnP de l'avoir signalé.

+0

Vous pouvez utiliser $ front-> hasPlugin ($ name); – takeshin

+3

+1 fonctionne comme un charme et pour tous ceux qui se demandent où instancier le plugin. mettre 'Zend_Controller_Front :: registerPlugin (new My_Controller_Plugin_Utilities())' dans votre bootstrap le fera. – JohnP

+0

S'il vous plaît noter que j'ai mis à jour le code (a changé le nom de classe), de sorte que copier et coller aurait plus de sens. Il faisait partie de ma classe d'utilitaires et maintenant il devrait être plus descriptif. –

3

L'approche alternative peut être de lancer des exceptions spécifiques pour chaque module (ou la fonctionnalité dont vous avez besoin, par exemple Mymodule_MyException), puis de les gérer dans Default_ErrorController.

Questions connexes