ThinkPHP 6.x 中间件执行顺序由 app/middleware.php 数组索引决定,请求阶段从上到下、响应阶段倒序执行;不支持 priority 属性或键值对写法,插队需调整数组位置,路由中间件追加于全局之后,调试应以日志为准。

ThinkPHP 的中间件顺序不能靠“自定义优先级数字”控制,而是由注册顺序和分组规则决定——改错地方就永远调不顺。
中间件执行顺序只取决于 app/middleware.php 里的数组索引
ThinkPHP(6.x)不支持给中间件设 priority 或权重值。它按 app/middleware.php 中返回的数组从上到下依次执行,先写的先执行(请求阶段),后写的后执行(响应阶段)。
-
app/middleware.php返回的是一个「中间件类名数组」,不是键值对,不能用['auth' => AuthMiddleware::class]这种写法 - 如果写了
[AuthMiddleware::class, CheckTokenMiddleware::class],那么请求时AuthMiddleware::handle()先跑,响应时CheckTokenMiddleware::handle()先结束(即倒序执行响应逻辑) - 全局中间件只走这一份数组;路由/控制器绑定的中间件是额外追加的,会在全局之后执行
想让某个中间件「插队」到最前?别动配置,改注册位置
比如你希望 ForceHttpsMiddleware 在所有中间件之前拦截 HTTP 请求,就必须把它放在 app/middleware.php 数组的第一个位置:
return [
\app\middleware\ForceHttpsMiddleware::class,
\think\middleware\LoadLangPack::class,
\think\middleware\SessionInit::class,
// ... 其他中间件
];
- 不要试图在中间件类里加
protected $priority = -100—— ThinkPHP 完全不读这个属性 - 也不要在
app/middleware.php里用array_unshift()动态插入,因为该文件被 require 一次后就缓存了,热更新无效 - 若用命令行生成中间件(
php think make:middleware LogRequest),默认不会自动写入middleware.php,必须手动加进去
路由级中间件会追加在全局之后,但可覆盖全局
在路由定义中用 ->middleware() 添加的中间件,是在全局中间件执行完后才开始执行的。但如果你明确禁用了某个全局中间件,它就不会出现:
Route::get('api/user', 'UserController@index')
->middleware([\app\middleware\AuthMiddleware::class])
->withoutMiddleware([\think\middleware\CheckRequestCache::class]);
-
->withoutMiddleware()只能屏蔽全局中间件,不能屏蔽同一路由上其他->middleware()添加的中间件 - 多个
->middleware()调用会合并成一个数组,顺序就是调用顺序:先->middleware(A::class)再->middleware(B::class),则 A 在 B 前执行 - 注意:控制器构造方法里
$this->middleware()是运行时注册,比路由定义更晚,慎用——容易绕晕执行链
调试中间件顺序最直接的办法:打日志 + 看 trace
别猜,直接在每个中间件的 handle() 开头加一行日志:
public function handle($request, \Closure $next)
{
\think\facade\Log::info('→ Running ' . static::class);
$response = $next($request);
\think\facade\Log::info('← Done ' . static::class);
return $response;
}
- 查看
runtime/log/下当天日志,就能清晰看到执行和退出的嵌套结构 - 如果发现某个中间件没执行,先检查是否被
->withoutMiddleware()屏蔽,再确认类路径是否拼错(比如漏了\app\命名空间) - 中间件里抛出异常会中断后续所有中间件(包括响应阶段),所以
try/catch要小心包裹,否则你以为的“顺序问题”其实是提前终止
真正难的不是怎么排顺序,而是搞清「哪一层在控制顺序」:全局配置、路由绑定、控制器注册、分组中间件——它们不是并列关系,而是有明确的叠加规则。看错层级,改半天都白搭。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











