Zend Framework: как обрабатывать исключения в Ajax-запросах? - PullRequest
4 голосов
/ 01 июня 2010

Обычно, когда выдается исключение, контроллер ошибок принимает команду и отображает страницу ошибки с обычным общим заголовком и нижним колонтитулом.

Такое поведение не требуется в запросе Ajax.Потому что в случае ошибки вся HTML-страница пересылается.А в случаях, когда я непосредственно загружаю содержимое http-ответа в div, это еще более нежелательно.

Вместо этого, в случае запроса Ajax, я просто хочу получить «фактическую ошибку», генерируемую исключением.

Как я могу это сделать?

Я думаю, один грязный способ может быть: установить переменную в ajax-запросе и обработать соответствующим образом.Не хорошее решение.

Ответы [ 3 ]

2 голосов
/ 01 июня 2010

если вы используете помощники действий contextSwitch или ajaxContext для кодирования вашей ошибки (возможно, отключив autoJsonSerialization), вы можете просто передать ошибки обратно как объекты JSON / XML.

http://framework.zend.com/manual/en/zend.controller.actionhelpers.html#zend.controller.actionhelpers.contextswitch

class Error_Controller extends Zend_Controller{
    public function errorAction(){
        $contextSwitch = $this->_helper->getHelper('contextSwitch');
        $contextSwitch->addActionContext($this->getRequest()->getActionName(),'json')
            ->initContext();
        $errors = $this->_getParam('error_handler');
        $this->view->exception = $errors->exception;
    }
}

Оттуда вы должны либо передать параметр format = json, который запрашивает каждый AJAX, либо настроить цепочку маршрутизации, которая автоматически добавляет его.

Для «немного» более безопасной настройки вы можете использовать ajaxContext в качестве помощника, и только запросы с заголовком XMLHttpRequest будут обрабатываться json.

1 голос
/ 23 ноября 2011

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

Вот решение, которое я в итоге придумал:

class ErrorController extends Zend_Controller_Action
{
    public function init()
    {
        // Add the context to the error action
        $this->_helper->contextSwitch()->addActionContext('error', 'json');
    }

    public function errorAction()
    {
        // Check if this is an Ajax request
        if ($this->getRequest()->isXmlHttpRequest()) {

            // Force to use the JSON context, which will disable the layout.
            $this->_helper->contextSwitch()->initContext('json');

            //   Note: Using the 'json' parameter is required here unless you are
            //   passing '/format/json' as part of your URL.
        }

        // ... standard ErrorController code, cont'd ...
1 голос
/ 01 апреля 2011

Код, который я использую, сохраняет обработку ошибок для не-Ajax-запросов, сохраняя при этом параметр displayExceptions. Это похоже на обычный обработчик ошибок, в котором трассировка стека и параметры запроса также отправляются обратно, когда displayExceptions активен в вашем файле application.ini . Отправка обратно данных JSON очень гибка - вы можете создать собственный класс, использовать представление с помощником представления JSON и т. Д.

class ErrorController extends Zend_Controller_Action
{
    public function errorAction()
    {
        $errors = $this->_getParam('error_handler');

        if ($this->getRequest()->isXmlHttpRequest()) {
            $this->_helper->contextSwitch()->initJsonContext();

            $response = array('success' => false);

            if ($this->getInvokeArg('displayExceptions') == true) {
                // Add exception error message
                $response['exception'] = $errors->exception->getMessage();

                // Send stack trace
                $response['trace'] = $errors->exception->getTrace();

                // Send request params
                $response['request'] = $this->getRequest()->getParams();
            }

            echo Zend_Json::encode($response);
            return;
        }

        switch ($errors->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:

                // 404 error -- controller or action not found
                $this->getResponse()->setHttpResponseCode(404);
                $this->view->message = 'Page not found';
                break;
            default:
                // application error
                $this->getResponse()->setHttpResponseCode(500);
                $this->view->message = 'Application error';
                break;
        }

        // conditionally display exceptions
        if ($this->getInvokeArg('displayExceptions') == true) {
            $this->view->exception = $errors->exception;
        }

        $this->view->request = $errors->request;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...