Обработка ошибок на основе модуля Zend Framework

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

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

Ответ 1

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

Ответ 2

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