2

CodeIgniter 的 show_error 函数处理错误,有什么方法可以覆盖它以将它们的信息输出为 json 对象?

4

2 回答 2

27

好吧,如果您希望返回复杂的错误对象(例如数组),那么这个解决方案可能并不完全有用(虽然您可以,但您必须在客户端解析 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 选项

标头信息

免责声明: 屏幕截图不是从生产服务器上截取的 :)

于 2014-02-14T18:13:33.237 回答
5

在“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;
}

全部归功于“奥利弗·史密斯”。

于 2013-09-06T19:53:00.937 回答