2010-08-23 6 views
5

У меня есть плагин Acl, который расширяет Zend_Controller_Plugin_Abstract, этот плагин обрабатывает весь мой код Acl.Обработка Исключения, брошенные в плагины контроллера Zend Framework

Я хочу бросить исключение в этом подключаемом модуле, например. Exception_Unauthorised, а затем обработайте это в моем ErrorController, таким образом я могу использовать тот же плагин Acl для разных приложений и использовать ErrorController для обработки каждой ситуации в каждом приложении по-разному - если нужно.

Проблема в том, что исключение Исключения в подключаемый модуль не останавливает выполнение оригинального действия. Таким образом, я получаю исходный выход Action и вывод ErrorController.

Как я могу получить Исключение, брошенное в плагин, чтобы остановить исходное действие?

Случай 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"); 
} 

Случай 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) 
    { 

    } 
} 

Случай 3

Я думаю, что это где проблема, путем изменения контроллера.

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

ответ

4

Я имел быстрый чат об этом на IRC канале #zftalk, и Райан може/Bittarman сказал, что в настоящее время вы должны вручную перенаправить пользователя, если за исключением происходит в плагине.

У меня также возникла идея, что, возможно, вы можете использовать отдельный плагин для проверки исключения. Если вы посмотрите на плагин ErrorHandler, он проверяет, содержит ли запрос исключение и действует на него.

Проблема заключается в том, что ErrorHandler запускается на routeShutdown, например. когда запрос уже завершен. Если вы создали пользовательский плагин, который смотрит на исключение, но работает на preDispatch, возможно автоматизировать эту задачу.

Обратите внимание, что вам нужно убедиться, что этот пользовательский плагин запускается после любых плагинов, которые могут генерировать исключения.

+0

это все имеет смысл. Думаю, я предпочел бы перенаправить пользователя и обработать его таким образом. Вместо того, чтобы создавать плагин для исключения Exception в других подключаемых модулях, может закончиться запутать меня больше! –

+0

Я отметил это как ответ, потому что вы не можете делать то, что я хочу, но это ближе всего к тому, чтобы попасть туда. –

0

Это должно сработать. Все зависит от того, когда или где вы выбрали исключение. Взгляните на этом блоге:

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

+0

Посмотрите на последний комментарий на этот пост - http://codeutopia.net/blog/2009/03/02/handling-errors-in-zend-framework/#comment-62592 - это от меня. :-) Я выкидываю ошибку в 'preDispatch()' в моей 'Zend_Controller_Plugin_Abstract' –

+0

@jakenoble, Вставьте некоторый код. Когда вы вызываете 'parent :: preDispatch()'? Уже зарегистрирован 'error_handler'? – takeshin

+0

@takeshin Я думаю, что error_handler не зарегистрирован. Если я выброшу Exception вне инструкции 'try {}' в 'preDispatch()', он не попадает в 'ErrorController'.Я не указал явным образом, чтобы приложение не регистрировало error_handler. Нужно ли явно загружать его в мой класс «Bootstrap», чтобы убедиться, что он есть для моего подключаемого модуля? –

0

Это то, что я делаю.

// 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); 
Смежные вопросы