JSON応答jquery/ajax呼び出しを介してphp例外をスローするクリーンで簡単な方法はありますか.
5 に答える
PHP で次のようなことができます (これが AJAX 経由で呼び出されると仮定します)。
<?php
try {
if (some_bad_condition) {
throw new Exception('Test error', 123);
}
echo json_encode(array(
'result' => 'vanilla!',
));
} catch (Exception $e) {
echo json_encode(array(
'error' => array(
'msg' => $e->getMessage(),
'code' => $e->getCode(),
),
));
}
JavaScript の場合:
$.ajax({
// ...
success: function(data) {
if (data.error) {
// handle the error
throw data.error.msg;
}
alert(data.result);
}
});
error:
400 (たとえば) ヘッダーを返すことで、 $.ajax()のハンドラーをトリガーすることもできます。
header('HTTP/1.0 400 Bad error');
またはStatus:
、FastCGI を使用している場合に使用します。error:
ハンドラーはエラーの詳細を受信しないことに注意してください。それを達成するには、どのように機能するかをオーバーライドする必要があります$.ajax()
:)
Facebook は、何らかの理由で HTTP 要求が失敗した場合に例外をスローする PHP SDK で何かを行います。このアプローチを取ることができ、例外がスローされた場合にエラーと例外の詳細を返すだけです。
<?php
header('Content-Type: application/json');
try {
// something; result successful
echo json_encode(array(
'results' => $results
));
}
catch (Exception $e) {
echo json_encode(array(
'error' => array(
'code' => $e->getCode(),
'message' => $e->getMessage()
)
));
}
error
次に、JavaScript の AJAX 呼び出しでキーをリッスンするだけです。
<script>
$.getJSON('http://example.com/some_endpoint.php', function(response) {
if (response.error) {
// an error occurred
}
else {
$.each(response.results, function(i, result) {
// do something with each result
});
}
});
</script>
すべてのエラーを同じ方法で処理する必要がある場合 (たとえば、ダイアログを表示する)。次の方法で実行できます。
PHP終了:
public function throwJsonException($msg) {
echo json_encode(array('error'=> true, 'msg' => $msg));
}
throwJsonException('login invalid!');
jQuery 終了:
$(document).ajaxSuccess(function(evt, request, settings){
var data=request.responseText;
if (data.length>0) {
var resp=$.parseJSON(data);
if (resp.error)
{
showDialog(resp.msg);
return;
}
}
});
前の回答を補完するものとして、すべての例外で json エンコードの同じコードを繰り返す代わりに、必要なスクリプトでのみ使用されるように例外ハンドラーを設定できます。例えば:
function ajaxExceptionHandler($e) {
echo json_encode(array(
'error' => array(
'code' => $e->getCode(),
'msg' => $e->getMessage())
));
}
次に、ajax ハンドラーで、
set_exception_handler('ajaxExceptionHandler');