ThinkPHP (TP) 內建 ajaxReturn() 方法,自動處理 JSON/XML/JSONP/EVAL 格式輸出並設定正確 Header,極大簡化 AJAX 介面開發。
<?php
class ApiController extends Controller {
public function addComment() {
$data = I('post.');
// 驗證...
$id = M('Comment')->add($data);
if ($id) {
$this->ajaxReturn(['status' => 1, 'id' => $id, 'msg' => '發布成功'], 'JSON');
} else {
$this->ajaxReturn(['status' => 0, 'msg' => '發布失敗'], 'JSON');
}
}
}
| 格式 | Content-Type | 用途 |
|---|---|---|
JSON | application/json | 現代 API 標準 (預設) |
XML | text/xml | 舊系統整合 |
JSONP | application/javascript | 跨域舊瀏覽器 |
EVAL | text/html | 直接回傳 JS 程式碼 (不推薦) |
<script>
$.post('{:U("Api/addComment")}', {
content: $('#content').val(),
article_id: 123
}, function(res) {
if (res.status === 1) {
layer.msg(res.msg, {icon: 1});
$('#comment-list').prepend(renderComment(res.id));
} else {
layer.msg(res.msg, {icon: 2});
}
}, 'json'); // 告訴 jQuery 自動解析 JSON
</script>
在基礎控制器封裝:
protected function apiReturn($status, $msg = '', $data = [], $code = 200) {
$this->ajaxReturn([
'code' => $code,
'status' => $status, // 1 成功 0 失敗
'msg' => $msg,
'data' => $data
], 'JSON');
}
// 使用
$this->apiReturn(1, '登入成功', ['token' => $token]);
<?php 前無 BOM、無 echo/var_dump、關閉標籤 ?> 後無內容。APP_DEBUG=true 會在 JSON 前輸出 Trace,生產環境必須關閉。ajaxReturn 內部已 json_encode(..., JSON_UNESCAPED_UNICODE) (TP 3.2.3+)。_initialize() 加入 header('Access-Control-Allow-Origin: *');。