2010-08-23 11 views
5

Ich habe ein Acl-Plug-in, das Zend_Controller_Plugin_Abstract erweitert, dieses Plug-in behandelt alle meine Acl-Code.Behandlung von Ausnahmen in Zend Framework-Controller-Plugins

Ich möchte geworfen eine Ausnahme in diesem Plug-in, z.B. ein Exception_Unauthorised und dann handhabt dies in meinem ErrorController, auf diese Weise ich die gleichen Acl-Plug-in für verschiedene Anwendungen verwenden kann, und verwenden Sie die ErrorController jede Situation in jeder Anwendung unterschiedlich zu behandeln - wenn es sein muss.

Das Problem ist, dass das Auslösen einer Ausnahme im Plug-in die Ausführung der ursprünglichen Aktion nicht stoppt. Also habe ich am Ende die ursprüngliche Action-Ausgabe und die ErrorController Ausgabe.

Wie kann ich eine Exception in ein Plug-in werfen, um die ursprüngliche Aktion zu stoppen?

Fall 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"); 
} 

Fall 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) 
    { 

    } 
} 

Fall 3

Ich denke, das ist, wo das Problem ist, durch den Controller zu ändern.

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"); 
    } 
} 

Antwort

4

hatte ich ein kurzes Gespräch über diese auf dem #zftalk IRC-Kanal und Ryan Mauger/Bittarman sagte, dass derzeit würden Sie müssen manuell den Benutzer, wenn die Ausnahme umleiten passiert in einem Plugin.

Ich hatte auch eine Idee, dass Sie vielleicht ein separates Plugin verwenden könnten, um nach einer Ausnahme zu suchen. Wenn Sie sich das ErrorHandler-Plugin ansehen, überprüft es, ob die Anfrage eine Ausnahme enthält und handelt darauf.

Das Problem ist, dass das Fehlerbehandler Feuer auf routeshutdown, zum Beispiel. wenn die Anfrage bereits abgeschlossen ist. Wenn Sie ein eigenes Plugin erstellt, die an der Ausnahme sieht, läuft aber auf preDispatch, könnte es möglich sein, diese Aufgabe zu automatisieren.

Beachten Sie, dass Sie sicherstellen müssen, dass dieses benutzerdefinierte Plug-in nach Plug-ins ausgeführt wird, die Ausnahmen auslösen können.

+0

das macht alles Sinn. Ich denke, ich würde den Benutzer eher umleiten und damit umgehen. Anstatt ein Plug-in zu erstellen, um eine Exception in anderen Plug-Ins zu erfassen, könnte es am Ende für mich verwirrender sein! –

+0

Ich markierte dies als die Antwort, weil Sie nicht tun können, was ich will, aber das ist am nächsten, um dorthin zu gelangen. –

0

Dies sollte funktionieren. Alles hängt davon ab, wann oder wo Sie die Ausnahme werfen. Werfen Sie einen Blick auf diesen Blog-Post:

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

+0

Werfen Sie einen Blick auf die letzten Kommentar auf diesem Posten - http://codeutopia.net/blog/2009/03/02/handling-errors-in-zend-framework/#comment-62592 - es ist von mir. :-) Ich werfe den Fehler in 'preDispatch()' in meinem 'Zend_Controller_Plugin_Abstract' –

+0

@jakenoble, Einfügen von Code. Wann rufst du 'parent :: preDispatch()'? Ist 'error_handler' bereits registriert? – takeshin

+0

@takeshin ich glaube, der error_handler nicht registriert ist. Wenn ich die Ausnahme außerhalb einer 'try {}' 'Anweisung in preDispatch() werfen' es nicht von dem 'ErrorController' verfängt.Ich habe die Anwendung nicht explizit festgelegt, um den error_handler nicht zu registrieren. Muss ich es explizit in meiner Bootstrap-Klasse laden, um sicherzustellen, dass es für mein Plug-in da ist? –

0

Dies ist, was ich tue.

// 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); 
Verwandte Themen