2010-08-23 4 views
5

J'ai un plugin Acl qui s'étend sur Zend_Controller_Plugin_Abstract, ce plugin gère tout mon code Acl.Gestion des exceptions lancées dans les plugins de contrôle de Zend Framework

Je souhaite lancer une exception dans ce plug-in, par ex. un Exception_Unauthorised et puis gérer cela dans mon ErrorController, de cette façon je peux utiliser le même plug-in Acl pour différentes applications et utiliser le ErrorController pour gérer chaque situation dans chaque application différemment - si besoin est.

Le problème est que le lancement d'une exception dans le plug-in n'arrête pas l'exécution de l'action d'origine. Donc, je me retrouve avec la sortie de l'action d'origine et la sortie ErrorController.

Comment puis-je obtenir une exception dans un plug-in pour arrêter l'action d'origine?

Case 1

// This throws the `Exception_NoPermissions`, but it does not get caught by 
// `ErrorController` 
public function preDispatch(Zend_Controller_Request_Abstract $request) 
{  
    parent::preDispatch($request); 
    throw new Exception_NoPermissions("incorrect permissions"); 
} 

Case 2

// This behaves as expected and allows me to catch my Exception 
public function preDispatch(Zend_Controller_Request_Abstract $request) 
{  
    parent::preDispatch($request); 
    try 
    { 
     throw new Exception_NoPermissions("incorrect permissions"); 
    } 
    catch(Exception_NoPermissions $e) 
    { 

    } 
} 

Cas n ° 3

Je pense que c'est là la question est, en changeant le contrôleur.

public function preDispatch(Zend_Controller_Request_Abstract $request) 
{  
    parent::preDispatch($request); 

    // Attempt to log in the user 

    // Check user against ACL 

    if(!$loggedIn || !$access) 
    { 
     // set controller to login, doing this displays the ErrorController output and 
     // the login controller 
     $request->getControllerName("login"); 
    } 
} 

Répondre

4

J'ai eu une brève discussion à ce sujet sur le canal IRC#zftalk et Ryan Mauger/Bittarman dit que vous actuellement besoin de rediriger manuellement l'utilisateur si l'exception se passe dans un plugin. J'ai également eu l'idée que vous pourriez peut-être utiliser un plugin séparé pour vérifier une exception. Si vous regardez le plugin ErrorHandler, il vérifie si la requête contient une exception et agit dessus.

Le problème est que ErrorHandler se déclenche sur routeShutdown, par exemple. lorsque la demande est déjà terminée Si vous avez créé un plugin personnalisé qui examine l'exception, mais s'exécute sur preDispatch, il peut être possible d'automatiser cette tâche.

Notez que vous devez vous assurer que ce plugin personnalisé est exécuté après tous les plugins pouvant générer des exceptions.

+0

que tout a du sens. Je pense que je préfère rediriger l'utilisateur et le gérer de cette façon. Plutôt que de créer un plug-in pour attraper une Exception dans d'autres plug-ins, cela pourrait me perturber davantage! –

+0

J'ai marqué ceci comme la réponse parce que vous ne pouvez pas sembler faire ce que je veux, mais c'est le plus proche d'y arriver. –

0

Cela devrait fonctionner. Tout dépend, quand et où vous lancez l'exception. Jetez un oeil à ce blog:

Handling errors in Zend Framework | CodeUtopia - The blog of Jani Hartikainen

+0

Jetez un oeil à le dernier commentaire sur ce poste - http://codeutopia.net/blog/2009/03/02/handling-errors-in-zend-framework/#comment-62592 - il est de moi. :-) Je lance l'erreur dans 'preDispatch()' dans mon 'Zend_Controller_Plugin_Abstract' –

+0

@jakenoble, Coller du code. Quand appelez-vous 'parent :: preDispatch()'? Est-ce que 'error_handler' est déjà enregistré? – takeshin

+0

@takeshin Je pense que error_handler n'est pas enregistré. Si je lance l'Exception en dehors d'une instruction 'try {}' dans 'preDispatch()', elle n'est pas interceptée par 'ErrorController'.Je n'ai pas explicitement défini l'application pour ne pas enregistrer le error_handler. Ai-je besoin de le charger explicitement dans ma classe 'Bootstrap' afin de m'assurer qu'il est là pour mon plug-in? –

0

C'est ce que je fais.

// Get Request Object... 
$request = $this->getRequest(); 
// Do manual redirect.. select your own action... 
$this->getRequest()->setControllerName('error')->setActionName('could-not-find-destination')->setDispatched(true); 
$error = new Zend_Controller_Plugin_ErrorHandler(); 
$error->type = Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER; 
$error->request = clone($request); 
$error->exception = $e; // If you have caught the exception to $e, set it. 
$request->setParam('error_handler', $error); 
Questions connexes