Как я могу настроить (или переопределить) функцию 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; }
Все кредиты «Оливеру Смиту».