CodeIgniter 的 show_error 函数处理错误,有什么方法可以覆盖它以将它们的信息输出为 json 对象?
2 回答
好吧,如果您希望返回复杂的错误对象(例如数组),那么这个解决方案可能并不完全有用(虽然您可以,但您必须在客户端解析 json),但我们开始:
只需使用 HTTP
为什么?好吧,您可以将第二个参数传递给它,它恰好是 HTTP 响应代码,它恰好很酷,因为它允许您使您的应用程序支持 HTTP,并且与客户端 ajax 请求配合得非常好。
你要做的是首先定义后端会发生什么样的错误,这里有一个 HTTP 错误代码列表。
HTTP 错误代码
您很可能会使用 200、400 和 500 范围内的错误代码。实际上,当您在 Web 浏览器上访问服务器时,它通常会收到 200 个 http 响应代码,这意味着一切正常。
你见过那些“内部服务器错误”消息吗?好吧,它们是 500 个 http 响应代码。这就是说,这是来自服务器的错误。哪一个?这取决于您如何对它们进行分类,在 500 范围内有一组错误,但如果您不想为此烦恼,只需使用 500 通用错误代码响应。
另一个范围是 400。这些通常是来自用户的错误,例如,如果您访问服务器内部的 url,但它不存在,您会得到著名的 404 not found,400 是一个通用错误代码,意味着客户端 (在这种情况下,浏览器)请求了某些东西,但请求无效,特别是在 404 的情况下,您请求的资源未找到,这是客户端错误,因为您应该知道服务器上有哪些资源可用.
如何在codeigniter中做到这一点
实际上非常简单。如果您在文档中看到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 的开发人员工具。例如,如果您使用谷歌浏览器,您可以打开开发者工具:
转到网络选项卡,您将看到 HTTP 请求,单击其名称
您将使用通常的 CI 模板查看详细信息和自定义错误消息,这是在请求中与您的消息一起返回的 html
最后,如果您想进一步挖掘并准确调试从 php/web 服务器发送到客户端的内容,请转到 headers 选项
免责声明: 屏幕截图不是从生产服务器上截取的 :)
在“Oliver Smith”博客上找到更多的答案......
我通过扩展 CI_Exceptions 将此函数添加到 CI 核心函数中:
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;
}
全部归功于“奥利弗·史密斯”。