必须用 return json($data),因TP6响应机制按返回值类型匹配Response类,直接return数组会触发ViewInit中间件导致模板渲染;json($data)自动设Content-Type、处理中文编码,且必须return结尾。

ThinkPHP 输出数据不是靠“函数”随便一 echo 就完事,而是分场景、讲规范:接口返回 JSON 要用 json(),模板渲染要用 assign(),导出文件得手动控制输出流,硬写 echo 或 print 很容易出错。
接口返回 JSON:必须用 json() 并 return
别写 echo json_encode($data);,也别漏掉 return。TP6 直接 return json($data); 就行——它自动设好 Content-Type: application/json; charset=utf-8,中文不转义,特殊字符安全转义。
- TP6 中传数组或对象都支持,但不能传资源(比如数据库结果集)
- TP5.1 要显式启用中文不转义:
return json($data, 200, [], ['json_encode_param' => JSON_UNESCAPED_UNICODE]); - 写了
json($data)却没return,页面会空白,因为响应对象没被框架真正发送 -
success()是语义化封装,结构固定;json()更自由,适合自定义字段
模板中输出变量:assign + {$var} 语法
控制器里用 $this->assign('list', $data); 把数据传给模板,模板里用 {$list} 或 {volist name="list" id="item"}{$item.name}{/volist} 渲染。
- 数组字段可用
{$list.0.name}或{$list['name']} - 输出前建议过滤:如
{$content|htmlspecialchars}防 XSS - 支持默认值:
{$title|default='无标题'} - 可调用函数:
{:date('Y-m-d', $time)}或{$create_time|date='Y-m-d H:i'}
处理 JSON 请求体:不能靠 input(),得用 json()
前端发 Content-Type: application/json,TP6 默认不解析,$request->input('key') 一定为空。必须改用 $request->json('key') 或在 TP6.1+ 中先调 $request->withJson(true)。
立即学习“PHP免费学习笔记(深入)”;
-
$request->json()返回完整数组;$request->json('user.name')支持点号取嵌套字段 - JSON 格式错误时返回
null,记得判断:if (!$data = $request->json()) { /* 处理错误 */ } - 不要写
$request->input('xxx', '', 'json')—— 第三个参数在这里无效 - Content-Type 必须严格是
application/json,带; charset=utf-8在某些版本可能失败
导出 CSV 或 Excel:绕过模板,直输 php://output
导出不能走视图渲染,得清缓冲、设 header、手动写入。小批量导 CSV 推荐原生 fputcsv;Excel 导出必须用 PhpSpreadsheet,且避免一次性加载全部数据。
- CSV 开头加 BOM:
echo "\xEF\xBB\xBF";,否则 Excel 打开中文乱码 - 用
Db::cursor()流式查数据,逐行fputcsv($fp, $row),不爆内存 - Excel 导出时禁用公式计算引擎:
$spreadsheet->getCalculationEngine()->disable(); - 务必
ob_end_clean()清缓冲,防止 HTML 内容混进文件开头



















