Установить другой обработчик ошибок в зависимости от модуля - Zend Framework - PullRequest
0 голосов
/ 10 июня 2010

У меня есть несколько модулей, один из которых API. Я хочу установить другой ErrorHandler для этого модуля API.

Потому что при запуске ErrorHandler по умолчанию он использует модуль по умолчанию с макетом по умолчанию, который содержит HTML. Что-то, что я не хочу, чтобы мой API возвращал.

Я смотрел здесь и на Zend Docs и не придумал ничего, что позволило бы мне это сделать.

Спасибо за любую помощь.

Ответы [ 3 ]

4 голосов
/ 11 июня 2010

Вот тот, который я использую:

<?php
class My_Controller_Plugin_Modular_ErrorController extends Zend_Controller_Plugin_Abstract
{
    public function routeShutdown (Zend_Controller_Request_Abstract $request)
    {
        $front = Zend_Controller_Front::getInstance();

        // Front controller has error handler plugin
        // if the request is an error request.
        // If the error handler plugin is not registered,
        // we will be unable which MCA to run, so do not continue.
        $errorHandlerClass = 'Zend_Controller_Plugin_ErrorHandler';
        if (!$front->hasPlugin($errorHandlerClass)) {

            return false;
        }

        // Determine new error controller module_ErrorController_ErrorAction
        $plugin = $front->getPlugin($errorHandlerClass);
        $errorController = $plugin->getErrorHandlerController();
        $errorAaction = $plugin->getErrorHandlerAction();
        $module = $request->getModuleName();

        // Create test request module_ErrorController_ErrorAction...
        $testRequest = new Zend_Controller_Request_Http();
        $testRequest->setModuleName($module)
            ->setControllerName($errorController)
            ->setActionName($errorAaction);

        // Set new error controller if available
        if ($front->getDispatcher()->isDispatchable($testRequest)) {
            $plugin->setErrorHandlerModule($module);
        } else {

            return false;
        }

        return true;
    }
}

(Кстати, этот вопрос уже обсуждался здесь, посмотрите внимательно.)

1 голос
/ 16 марта 2011

@ takehin: Спасибо, что поделились своим плагином, это здорово!И именно то, что я искал на машине Google.

Я внес некоторые изменения, с уважением, в логику, которая определяет запрос как «запрос об ошибке», так как я обнаружил, что полный обратный вызов плагина выполнялся при каждом запросе, независимо от того, была ли ошибкаПроизошло.

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

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

<?php
class Rm_Controller_Plugin_Modular_ErrorController
    extends Zend_Controller_Plugin_Abstract
{
    public function postDispatch(Zend_Controller_Request_Abstract $request)
    {
        $front = Zend_Controller_Front::getInstance();

        // true if response has any exception
        $isError = $front->getResponse()->hasExceptionOfType('Exception');

        // if there was no error during dispatch
        if (!$isError) {
            return false;
        }

        // standard error handler plugin class name
        $errorHandlerClass = 'Zend_Controller_Plugin_ErrorHandler';

        // if the error handler plugin is not registered, do not continue.
        if (!$front->hasPlugin($errorHandlerClass)) {
            return false;
        }

        $plugin = $front->getPlugin($errorHandlerClass);

        // the module that was requested and threw error
        $module = $request->getModuleName();

        // the controller & action name that error handler will dispatch
        $errorController = $plugin->getErrorHandlerController();
        $errorAction = $plugin->getErrorHandlerAction();

        // create a dummy request to test for dispatchablility
        $testRequest = new Zend_Controller_Request_Http();
        $testRequest->setModuleName($module)
            ->setControllerName($errorController)
            ->setActionName($errorAction);

        // verify that the current module has defined an ErrorController::errorAction
        if ($front->getDispatcher()->isDispatchable($testRequest)) {
            // tell error controller plugin to use the module's error controller
            $plugin->setErrorHandlerModule($module);
        } else {
            return false;
        }

        return true;
    }
}
0 голосов
/ 11 июня 2010

Сразу же, вы можете сохранить копию исходного объекта запроса в реестре из плагина контроллера.В preDispatch () вашего контроллера вы можете переслать другой контроллер ошибок на основе запрошенного модуля.

// Plugin
public function routeStartup(Zend_Controller_Request_Abstract $request)
{
    $clonedRequest = clone $request;
    Zend_Registry::set('originalRequest', $clonedRequest);
}

// ErrorController
public function preDispatch()
{
    $request = Zend_Registry::get('originalRequest');
    $this->_forward('error', 'error', $request->getModuleName());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...