Обработка исключений, возникающих в плагинах контроллера Zend Framework - PullRequest
5 голосов
/ 23 августа 2010

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

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

Проблемав том, что добавление исключения в плагин не останавливает выполнение исходного действия.В итоге я получаю вывод оригинального действия и вывод 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 ]

5 голосов
/ 24 марта 2011
4 голосов
/ 24 августа 2010

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

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

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

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

0 голосов
/ 02 января 2014

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

// 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);
0 голосов
/ 23 августа 2010

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

Обработка ошибок в Zend Framework | CodeUtopia - блог Яни Хартикайнен

...