ThinkPHP6.0中间件必须遵循洋葱模型,通过递归闭包嵌套执行,前置逻辑在$next前、后置逻辑在$next返回后运行;需严格使用$next($request)并返回其结果,注册时须带完整命名空间及::class后缀。

要让ThinkPHP6.0中间件按预期顺序执行并正确拦截请求,必须严格遵循其管道(Pipeline)机制与洋葱模型的调用逻辑,否则会出现中间件跳过、重复执行或无法终止请求等故障。
理解中间件执行的核心结构
ThinkPHP6.0中间件不是线性依次调用,而是通过 【递归闭包嵌套】 构建洋葱式结构:最外层中间件的 $next 参数,实际指向第二层中间件闭包;第二层的 $next 指向第三层……最后一层的 $next 才真正指向控制器调度方法 $this->dispatchToRoute($request)。
这意味着:前置逻辑在进入下一层前执行,后置逻辑必须等内层全部返回后才执行——若在某层中间件中直接 return Response,则内层完全不执行。
编写可执行的中间件类
第一步:使用命令行生成标准中间件文件
立即学习“PHP免费学习笔记(深入)”;
php think make:middleware AuthCheck
第二步:打开 app/middleware/AuthCheck.php,确认 handle 方法签名完整且仅含两个必需参数
第三步:在 handle 方法内,【必须调用 $next($request) 并返回其结果】,否则请求链断裂,控制器永远不会被调用。示例:
public function handle($request, \Closure $next)<br>{<br> if (!$request->session('user_id')) {<br> return redirect('/login');<br> }<br> return $next($request); // 缺少这行,路由将永不执行<br>}
注册中间件到正确作用域
方法一:全局注册(所有请求都经过)
编辑 config/middleware.php,在 'middleware' => [] 数组中追加类名:
app\middleware\AuthCheck::class
方法二:路由级注册(精准控制)
在路由定义处显式绑定:
Route::get('admin/dashboard', 'admin/index/dashboard')->middleware(app\middleware\AuthCheck::class);
方法三:应用级注册(仅限某应用)
修改对应应用目录下的 middleware.php,如 app/admin/middleware.php:
return [<br> app\middleware\AuthCheck::class,<br>];
注意:中间件类名必须带完整命名空间,且结尾必须是 ::class,写成字符串如 'AuthCheck' 将导致类加载失败。
验证执行顺序是否生效
第一步:在中间件 handle 方法开头插入日志输出
echo "AuthCheck → before\n";
第二步:在 $next($request) 后插入后置输出
$response = $next($request);<br>echo "AuthCheck → after\n";<br>return $response;
第三步:访问已绑定该中间件的路由,观察控制台或响应体中输出顺序是否为:
AuthCheck → before → [控制器输出] → AuthCheck → after
若只看到 “before” 未见 “after”,说明控制器抛出异常或中间件提前 return 了 Response,未走完完整流程。



















