tp6接口中间件不生效主因是加载链中断,需检查app/middleware.php存在性及返回有效数组、绑定方式是否匹配路由/分组/控制器级、handle方法签名是否为public function handle($request, \closure $next)并返回response实例。

TP6 接口中间件不生效,通常不是中间件写错了,而是请求根本没走到它那里——加载链在某个环节断开了。核心问题集中在注册、绑定、执行三个环节,下面分情况说明。
检查 app/middleware.php 是否存在且返回有效数组
TP6+ 废弃了 TP5.x 的函数式全局注册方式,app/middleware.php 是唯一支持应用级全局中间件的入口文件,必须满足以下条件:
- 文件真实存在,不能是 middleware.php.bak 或被注释掉
- 文件末尾有
return [];,且返回的是非空数组 - 数组元素是完整命名空间类名字符串,例如
\app\middleware\AuthCheck::class - 文件无 BOM 头、无 echo/print/exit 等额外输出
确认中间件是否绑定到对应路由或控制器
全局中间件 ≠ 所有接口都走它。权限校验、API 鉴权这类场景,更推荐按需绑定:
-
路由级:适用于单个接口,如
Route::post('api/login', 'Api/Login@login')->middleware(\app\middleware\TokenVerify::class); -
路由分组级:适用于整组 API,如
Route::group('api', function () { ... })->middleware(\app\middleware\ApiAuth::class); -
控制器级:在控制器构造函数中调用
$this->middleware(\app\middleware\AuthCheck::class);;注意资源路由Route::resource()不会自动继承该设置
验证中间件类本身是否规范
中间件类必须符合 PSR-15 规范,否则框架无法正确调用:
-
handle 方法签名必须声明 $next 类型为 \Closure:✅
public function handle($request, \Closure $next);❌public function handle($request, $next)会直接报 TypeError - 方法内必须 return 一个 Response 实例,哪怕只是
return $next->handle($request) - 若要中断流程(如未登录跳转),应返回
json(['code'=>401])或redirect(),不能用exit或die - 多应用模式下,注意中间件类路径与命名空间是否匹配,例如
app/api/middleware/AuthCheck.php对应命名空间app\api\middleware
排查常见干扰项
有些问题看似是中间件失效,实则是其他机制覆盖或阻断了执行:
- 中间件注册顺序错误:鉴权类若放在日志或 Session 中间件之后,可能日志已记录但权限校验被跳过
- 路由未正确加载:确保路由定义在
app/route.php并 return 一个 RuleGroup,而不是只写Route::get() - 跨域预检(OPTIONS)被拦截:若中间件里没处理
$request->isOptions(),浏览器预检失败会导致后续 POST 请求根本发不出,看起来像“接口不响应” - PHP 版本或扩展不一致:CLI 和 FPM 使用不同 PHP 版本或缺失 json/mbstring 扩展,会导致框架启动失败,中间件自然不加载











