必须用 return json($data),因thinkphp 6响应机制按返回值类型匹配response类,直接return数组会触发viewinit中间件导致模板渲染;json($data)返回json实例且需return结尾,否则响应为空,前置输出或bom会导致json解析失败。

必须用 return json($data),不能只写 json($data) 或 echo json_encode() —— 否则响应头缺失、内容错乱、前端解析失败是大概率事件。
为什么控制器里直接 return $data 不行
ThinkPHP 6 的响应机制靠返回值类型自动匹配 Response 类。直接 return ['code' => 0] 会被当成模板变量,触发 ViewInit 中间件(默认开启),最终渲染成 HTML 页面或报模板错误。
- 常见现象:页面空白、返回一堆 HTML 标签、浏览器下载一个 .txt 文件
- 根本原因:框架没识别出你要发 JSON,走的是视图渲染流程
- 绕过办法:路由定义时加
->withoutMiddleware(\think\middleware\ViewInit::class),但不如直接用json()干净
json() 必须 return,且只能在方法末尾
json($data) 返回的是 think\Response\Json 实例,不是“打印语句”。不 return 就等于构造完就丢弃,响应体为空。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 错误写法:
json($data); return true;→ 前端收不到 JSON,可能收个1或空响应 - 错误写法:
json($data); dump($data);→dump()触发输出,后续send()失败,报headers already sent - 正确姿势:控制器方法最后一行必须是
return json($data);,前面不能有echo、var_dump()、未捕获的 Notice(比如访问空数组键)
中文乱码、BOM、Unexpected token 0 怎么排查
TP6 默认启用 JSON_UNESCAPED_UNICODE,中文直出没问题;但文件编码或前置输出会破坏 JSON 结构,导致开头出现 EF BB BF(BOM)字节。
- 检查所有 PHP 文件(尤其是
app/controller/、config/、route/)是否为「UTF-8 无 BOM」格式 - 用命令行查 BOM:
head -n1 your_file.php | xxd,看到ef bb bf就要重存 - 调试时加一行:
dump(headers_sent());,返回true说明已有输出,得往前找空格、空行、warning - 浏览器看 Network → Response → 源码,如果第一行是
{(带隐藏字符),就是 BOM 或空格问题
需要自定义状态码或响应头怎么办
TP6 的 json() 支持链式调用,比 TP5.1 灵活得多,但参数含义和顺序容易混淆。
- 设状态码:
return json($data, 400);(第二个参数是 HTTP 状态码) - 设响应头:
return json($data)->header(['Access-Control-Allow-Origin' => '*']); - 紧凑格式(去缩进):
return json($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); - TP5.1 不支持链式 header,且第三个参数不能为空数组:
return json($data, 200, [], ['json_encode_param' => JSON_UNESCAPED_UNICODE]);
最常被忽略的点:上传、异常、中间件都可能提前中断响应流程。哪怕你写了 return json(),只要前面有 exit、throw new Exception 未被捕获、或中间件调用了 send(),JSON 就发不出去。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










