我可以更改CodeIgniter show_error函数以返回JSON对象吗?

时间:2013-09-04 13:17:44

标签: php ajax json codeigniter debugging

如何自定义(或覆盖)CodeIgniter的show_error函数以将错误返回为json?

2 个答案:

答案 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请求,点击其名称

Network details

您会看到详细信息以及使用常规CI模板的自定义错误消息,这是在请求中随消息返回的html

Request response

最后,如果你想进一步挖掘并完全调试从php / web服务器发送到客户端的内容,请转到header选项

Headers info

免责声明: 屏幕截图未从生产服务器获取:)

答案 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”。