如何自定义(或覆盖)CodeIgniter的show_error函数以将错误返回为json?
答案 0 :(得分:20)
好吧,如果您希望返回像数组这样的复杂错误对象,这个解决方案并不完全有用(尽管您可以,但是您必须在客户端上解析json)但是我们这样做了:
只需使用HTTP
为什么呢?好吧,你可以传递第二个参数,它恰好是HTTP响应代码,这恰好很酷,因为它允许你使你的应用程序具有HTTP感知能力,并且对于客户端ajax请求非常好。 / p>
您要做的是首先定义后端可能发生的错误类型,有一个HTTP错误代码列表here。
HTTP错误代码
您很可能会使用200,400和500范围内的错误代码。实际上,当你在网络浏览器上点击服务器时,它通常会收到200个http响应代码,这意味着一切都很顺利。
您是否看过那些“内部服务器错误”消息?那么他们是500个http响应代码。这意味着,这是服务器的错误。哪一个?这取决于你如何对它们进行分类,500范围内有一组错误,但如果你不想麻烦,只需使用500通用错误代码响应。
另一个范围是400.这些通常是来自用户的错误,例如,如果你去服务器内部的网址并且它不存在你会得到着名的404未找到,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 objects,并且您的工具包可能会对HTTP错误响应或成功响应进行回调。< / p>
我为什么要关心?
因为它遵循标准,它更容易调试,你将该工作委托给show_error()帮助器,这是有原因的,最重要的是因为所有cool kids are using it。
很酷,但是等等,我没有看到自定义错误消息!
这是正确的,因为当您在jquery的错误回调中捕获请求时,您得到的是通用错误描述和类似“内部服务器错误”和500的代码,但是,您仍然得到一个非常好的html响应您的自定义调试消息,看它只是使用某种开发人员工具的Firefox或Chrome。例如,如果您使用Google Chrome,则可以打开开发人员工具:
转到网络标签,您将看到HTTP请求,点击其名称
您会看到详细信息以及使用常规CI模板的自定义错误消息,这是在请求中随消息返回的html
最后,如果你想进一步挖掘并完全调试从php / web服务器发送到客户端的内容,请转到header选项
免责声明: 屏幕截图未从生产服务器获取:)
答案 1 :(得分:3)
在"Oliver Smith" blog上找到了更多的答案。
我通过使用以下方法扩展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;
}
所有归功于“Oliver Smith”。