Обработка ошибок на основе модуля Zend Framework - PullRequest
11 голосов
/ 27 апреля 2010

Zend_Controller_Plugin_ErrorHandler всегда пересылает ErrorController :: errorAction () в модуле по умолчанию, но я хочу, чтобы он был осведомлен о модуле. Например, когда генерируется исключение, оно должно вызывать ErrorController модуля, например Admin_ErrorController: errorAction.

Как я могу это сделать? Спасибо.

Ответы [ 2 ]

23 голосов
/ 27 апреля 2010

Вы можете создать плагин, который будет проверять ваш запрос на основе текущих наборов модулей 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());
        }
    }
}

Тогда используйте

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

для регистрации плагина в FrontController. Спасибо JohnP за указание на это.

3 голосов
/ 29 апреля 2010

Альтернативный подход может заключаться в создании определенных исключений для каждого модуля (или необходимых вам функций, например, Mymodule_MyException), а затем обрабатывать их в Default_ErrorController.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...