2

CodeIgniter の show_error 関数はエラーを処理しますが、それをオーバーライドして情報を json オブジェクトとして出力する方法はありますか?

4

2 に答える 2

27

配列のような複雑なエラー オブジェクトを返したい場合、このソリューションは完全には役に立たないかもしれません (可能ですが、クライアントで json を解析する必要があります)。

HTTPを使用するだけです

なんで?2 つ目のパラメーターを渡すことができます。これはたまたま HTTP 応答コードであり、たまたまクールです。これにより、アプリケーションを HTTP 対応にすることができ、クライアント側の ajax 要求で驚くほどうまく機能します。

やりたいことは、最初にバックエンドで発生する可能性のあるエラーの種類を定義することです。ここに HTTP エラー コードのリストがあります。

HTTP エラー コード

ほとんどの場合、200、400、および 500 の範囲のエラー コードを使用します。実際、Web ブラウザーでサーバーにアクセスすると、通常は 200 http 応答コードを受け取ります。これは、すべてが正常に行われたことを意味します。

これらの「内部サーバー エラー」メッセージを見たことがありますか? まあ、それらは 500 の http 応答コードです。つまり、サーバーからのエラーでした。どれ?それらをどのように分類するかによって異なります。500 の範囲に一連のエラーがありますが、それで手間をかけたくない場合は、500 の一般的なエラー コード応答を使用してください。

他の範囲は 400 です。これらは通常、ユーザーからのエラーです。たとえば、サーバー内の URL にアクセスし、それが存在しない場合、有名な 404 not found が表示されます。400 は、クライアント (この場合、ブラウザ) は何かを要求しましたが、要求は無効でした。具体的には 404 の場合、要求したリソースが見つからなかったということです。これはクライアント エラーです。これは、サーバーで利用可能なリソースを知っているはずだからです。 .

コードイグナイターでそれを行う方法

実際には非常に簡単です。ドキュメントでshow_error()のリファレンスを見ると、メソッドがエラー メッセージとして最初のパラメーターを受け取り、エラー コードを受け取るオプションの 2 番目のパラメーターを受け取ることが示されています。どのエラーコード?前に説明した 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 用のある種の開発者ツールを使用してください。たとえば、Google Chrome を使用している場合は、開発者ツールを開くことができます。

ネットワーク タブに移動すると、HTTP リクエストが表示されます。その名前をクリックします。

ネットワークの詳細

詳細とカスタム エラー メッセージが通常の CI テンプレートで表示されます。これは、リクエスト内のメッセージで返された html です。

リクエスト応答

最後に、さらに掘り下げて、php/web サーバーからクライアントに送信されたものを正確にデバッグする場合は、ヘッダー オプションに移動します。

ヘッダー情報

免責事項: スクリーンショットは本番サーバーから取得したものではありません :)

于 2014-02-14T18:13:33.237 に答える
5

「オリバー・スミス」ブログで、もう少しグーグルで答えを見つけました。

これで 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 に答える