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

问题描述 投票:1回答:2

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

php ajax json codeigniter debugging
2个回答
20
投票

好吧,如果您希望返回像数组这样的复杂错误对象,这个解决方案并不完全有用(尽管您可以,但是您必须在客户端上解析json)但是我们继续:

只需使用HTTP

为什么?好吧,你可以传递第二个参数,它恰好是HTTP响应代码,这恰好很酷,因为它允许你使你的应用程序具有HTTP感知能力,并且对于客户端ajax请求非常好。

你想要做的是首先定义后端会发生什么样的错误,有一个HTTP错误代码列表here

HTTP错误代码

您很可能会使用200,400和500范围内的错误代码。实际上当你在网络浏览器上点击服务器时,它通常会收到200个http响应代码,这意味着一切都很顺利。

你看过那些“内部服务器错误”消息吗?那么他们是500个http响应代码。这意味着,这是服务器的错误。哪一个?这取决于你如何对它们进行分类,500范围内有一组错误,但如果你不想麻烦,只需使用500通用错误代码响应。

另一个范围是400.这些通常是来自用户的错误,例如,如果你去服务器内部的URL并且它不存在你会得到着名的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错误响应或成功响应进行回调。

我为什么要关心?

因为它遵循标准,它更容易调试,你将该工作委托给show_error()帮助器,这是有原因的,最重要的是因为所有的cool kids are using it

很酷,但是等等,我没有看到我的自定义错误消息!

这是正确的,因为当您在jquery的错误回调中捕获请求时,您得到的是通用错误描述和类似“内部服务器错误”和500的代码,但是,您仍然可以使用自定义调试获得漂亮的HTML响应消息,看它只是使用某种开发人员工具的Firefox或Chrome。例如,如果您使用Google Chrome,则可以打开开发人员工具:

转到网络选项卡,您将看到HTTP请求,单击其名称

您将看到使用常用CI模板的详细信息和自定义错误消息,这是在请求中返回的带有消息的html

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

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


3
投票

"Oliver Smith" blog找到答案google了一点...

我通过扩展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;
}

所有学分归“奥利弗史密斯”。

© www.soinside.com 2019 - 2024. All rights reserved.