Intereting Posts
Вставка изображения с помощью PHP и FPDF, не удалось загрузить большое изображение Magento: Mage :: registry ('current_product') эффективен? Отражает ли идея идеи частных методов, потому что частные методы могут быть доступны за пределами класса? Включение / установка расширения Curl (OSX Server / PHP 5.3.3 / Apache 2.2) Поддерживает ли Google App Engine PHP? Выполнить инструкцию для всех строк xml? Magento onepage checkout saveOrder 302 перенаправление Сортировка многомерного массива на основе порядка простого массива Трудность запроса двух разных таблиц в базе данных с использованием SQL в PHP-документе Класс php не найден, если он включен Получить расширение файла (basename?) Сравните текущую дату с меткой времени в WordPress с помощью meta_query Добавление сеттеров и Getters в модель Laravel Избегайте, чтобы электронные письма считались спамом при отправке через контактную форму PHP query возвращает только строку в codeigniter

Могу ли я изменить функцию CodeIgniter show_error, чтобы вернуть объект JSON?

Как я могу настроить (или переопределить) функцию show_error для CodeIgniter, чтобы вернуть ошибку как json?

Возможно, это решение не совсем полезно, если вы хотите вернуть сложные объекты ошибок, такие как массивы (хотя вы могли бы, но вам пришлось бы разобрать json на клиенте), но здесь мы идем:

Просто используйте HTTP

Зачем? Ну, вы можете передать ему второй параметр, который, как представляется, является кодом ответа HTTP, который, случается, классный, потому что он позволяет сделать ваше приложение HTTP-осведомленным и работает с превосходным качеством с клиентскими аякс-запросами.

Что вы хотите сделать, сначала определите, какие ошибки могут возникнуть на бэкэнд, здесь есть список кодов ошибок HTTP.

Коды ошибок HTTP

Скорее всего, вы будете использовать коды ошибок в диапазонах 200, 400 и 500. Фактически, когда вы попадаете на сервер в своем веб-браузере, он обычно получает 200-код ответа HTTP, который означает, что все прошло хорошо.

Вы видели сообщения «Внутренний сервер»? Ну, они 500 http-ответов. И это означает, что это была ошибка с сервера. Который из? Это зависит от того, как вы их классифицируете, есть набор ошибок в диапазоне 500, но если вы не хотите, чтобы с ними возникали проблемы, просто используйте ответ на общий код общей ошибки 500.

Другой диапазон – 400. Обычно это ошибка пользователей, например, если вы переходите к URL-адресу внутри сервера, и его нет, вы бы получили знаменитый 404, который не найден, 400 – общий код ошибки, означающий, что клиент ( в этом случае браузер) запросил что-то, но запрос был недействительным, в частности, в случае 404, что запрошенный вами ресурс не найден, это ошибка клиента, поскольку вы должны знать, какие ресурсы доступны на сервере ,

Как это сделать в кодеигниторе

На самом деле это очень просто. Если вы видите ссылку show_error () в документации, она заявляет, что метод получает первый параметр в качестве сообщения об ошибке, а второй, необязательный, получает код ошибки. Какой код ошибки? Коды HTTP, о которых мы говорили ранее, так:

show_error('Howdy, this is my debug message', 500); 

Отправьте клиенту 500 HTTP-код ответа, включая ваше сообщение.

Как поймать в AJAX

Учитывая, что вы используете jQuery, это то, что вы обычно делаете:

 $.ajax({ type: 'POST', url : example.com/resource, data: $("#some-form").serialize(), dataType: 'json', success : function(data, textStatus, req) { //do something with data which is a json object returned from PHP }, error: function(req, textStatus, errorThrown) { //this is going to happen when you send something different from a 200 OK HTTP alert('Ooops, something happened: ' + textStatus + ' ' +errorThrown); } }); 

Если вы использовали какой-либо другой инструментарий или даже объект DOM, вы все равно можете их поймать, поскольку они просто объекты XMLHttpRequest и, скорее всего, ваш инструментарий имеет обратный вызов для ответа об ошибке HTTP или ответа на успех.

Почему меня это волнует?

Поскольку он соответствует стандартам, его легче отлаживать, вы делегируете эту работу помощнику show_error (), который существует по какой-то причине, а главное, потому что все классные дети используют его .

Прохладный, но подождите, я не вижу, чтобы мое сообщение об ошибке нигде не было!

Это верно, потому что, когда вы поймаете запрос в обратном вызове jQuery, вы получаете общее описание ошибки и код, например, «Внутренняя ошибка сервера» и 500 соответственно, однако вы все еще получили довольно html-ответ с вашей настраиваемой отладкой сообщение, чтобы увидеть его, просто используйте какой-то инструмент для разработчиков для firefox или chrome. Например, если вы используете Google Chrome, вы можете открыть инструменты разработчика:

Перейдите на вкладку «Сеть», и вы увидите HTTP-запрос, нажмите на его имя

Сведения о сети

Вы увидите детали и свое собственное сообщение об ошибке с обычным шаблоном CI, это был html, возвращенный с вашим сообщением внутри запроса

Ответ на запрос

Наконец, если вы хотите копать дальше и отлаживать именно то, что было отправлено с php / веб-сервера клиенту, перейдите к опции заголовков

Информация о заголовках

Отказ от ответственности: скриншоты не были взяты с производственного сервера 🙂

Нашел ответ googling немного больше … на блоге Оливера Смита .

Я добавлю эту функцию в основные функции CI, расширив CI_Exceptions следующим образом:

 function show_error($heading, $message, $template = 'error_general', $status_code = 500) { header('Cache-Control: no-cache, must-revalidate'); header('Content-type: application/json'); header("HTTP/1.1 500 Internal Server Error"); echo json_encode( array( 'status' => FALSE, 'error' => 'Internal Server Error', 'message' => $message ) ); exit; } 

Все кредиты «Оливеру Смиту».