中间件中return json()未中断请求,是因为json()返回response实例后必须显式return,否则框架继续执行;状态码需链式调用code()设置;中文转义需配置json_unescaped_unicode;非response返回值会被viewinit中间件渲染为html。

中间件里 return json() 为什么没中断请求?
因为 json() 是控制器层的快捷函数,在中间件中直接调用它但不返回 Response 实例,框架根本不会识别为“响应已就绪”。你写了 json(['code'=>401]) 却没 return,或者只写了 return 但返回的是数组、字符串甚至空值——这些都等于没告诉框架“停手”,后续中间件和控制器照常执行。
真正起效的唯一路径是:返回一个 think\Response 实例。框架在管道调度时检测到中间件返回了该类型对象,才会跳过剩余环节,直接进入响应发送阶段。
- ✅ 正确:
return json(['msg'=>'unauthorized'])->code(401);(json()本身返回Response,链式设状态码后return) - ✅ 正确:
return response()->json(['msg'=>'forbidden'])->code(403); - ❌ 错误:
json(['msg'=>'error']); return;(没返回值,框架继续走) - ❌ 错误:
echo json_encode([...]); exit;(绕过框架,Header、日志、事件全丢)
中间件返回 JSON 时状态码总是 200?
json() 函数默认不支持传状态码参数;response()->json() 默认也返回 200。这不是遗漏,是设计如此——状态码必须显式覆盖。
关键点在于调用顺序:code() 必须在 json() 之后链式调用,否则内部响应初始化已完成,再设无效。
- ✅ 有效:
return response()->json(['error'=>'invalid'])->code(400); - ❌ 无效:
return response()->code(400)->json(['error'=>'invalid']);(顺序反了) - ⚠️ 注意:
return json($data, 400)在 TP6 是合法的,但仅限json()快捷函数,不适用于response()->json()
中文被转成 \uXXXX?怎么让 JSON 响应直接显示汉字
TP6 默认用 json_encode() 且不带 JSON_UNESCAPED_UNICODE,所以中文自动转义。这不是错误,但调试和联调时很碍眼。
最稳妥的方案是全局配置(TP6.1+):在 config/app.php 中加一行:
'json_encode' => [JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES],
旧版 TP6.0 或需临时控制单个接口,可手动构造:
$jsonStr = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);return response($jsonStr)->header('Content-Type', 'application/json; charset=utf-8');
别写成 json(json_encode(...)),会二次编码炸掉结构。
中间件返回 JSON 后,前端收到的是 HTML 或下载文件?
大概率是 ViewInit 中间件在捣鬼——它会把任何非 Response 返回值当模板变量处理,强行渲染成 HTML。哪怕你中间件里已经 return response()->json(...),只要前面某层中间件没终止,ViewInit 就可能截胡。
解决方法不是改中间件逻辑,而是路由层排除干扰:
- 在定义路由时加
->withoutMiddleware(\think\middleware\ViewInit::class) - 或统一注册一个「全局 JSON 响应中间件」,放在所有中间件链末尾(但要在
ResponseTrace之后),对所有 API 路由强制重写响应体 - 调试时用
var_dump($response->getHeader('Content-Type'))确认真实输出头,别只信浏览器 Preview 标签
最易忽略的一点:中间件里任何前置输出(BOM、空格、未捕获 Notice)都会导致 headers already sent,状态码和 Content-Type 全部失效,只剩裸 JSON 字符串——这时候前端解析失败,但错误信息藏得极深。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











