ThinkPHP 6.0 注册自定义中间件需三步:生成类(php think make:middleware)、全局注册到app/middleware.php(必须用完整命名空间数组)、确认调用上下文(路由/控制器级绑定或验证生效)。

ThinkPHP 6.0 注册自定义中间件需分三步走:生成类、配置注册位置、确保调用上下文正确。漏掉任意一环,中间件就不会执行,且无报错提示,容易误判为“没生效”。
一、生成中间件类文件
使用命令行快速创建标准结构:
php think make:middleware CheckAuth
该命令会在 app/middleware/CheckAuth.php 生成带 handle() 方法的类。注意:
– 方法签名必须是 handle($request, \Closure $next);
– 返回值必须是 \think\Response 实例(如 redirect()、json() 或 $next($request));
– 可选添加 end(\think\Response $response) 方法,在响应发送前执行清理逻辑。
二、全局注册:写对 app/middleware.php
这是最常用也最容易出错的位置。该文件必须返回一个带完整命名空间的类名数组,且不能使用 use 语句:
立即学习“PHP免费学习笔记(深入)”;
- ✅ 正确(TP6 兼容):
return [\<br> \think\middleware\AllowCrossDomain::class,<br> \app\middleware\CheckAuth::class<br>];
- ❌ 错误示例:
–'app\middleware\CheckAuth'(缺反斜杠,PHP 在当前命名空间下找类,报错 Class not found);
–use app\middleware\CheckAuth; return [CheckAuth::class];(use 被忽略,等效于未定义)。
三、按需选择其他注册方式
除全局注册外,TP6 还支持更精细的控制:
-
路由级绑定:在路由定义时链式调用
->middleware(),支持字符串类名、::class 常量或闭包:Route::get('api/user', 'User@index')->middleware(\app\middleware\CheckAuth::class); -
控制器级绑定:在控制器的
initialize()方法中注册:$this->middleware->add(\app\middleware\CheckAuth::class); -
应用级(多应用模式):每个子应用需单独维护自己的
app/middleware.php。
四、验证是否真正生效
中间件静默失效很常见,建议用最小化测试确认:
- 在 handle() 中加一行
echo 'middleware hit'; exit;,访问对应路由看是否输出; - 检查中间件注册顺序:全局中间件按数组顺序执行,前置逻辑(如跨域)应放在签名校验之前;
- 若用 $request->param() 获取参数但客户端发的是 JSON,需改用
$request->getInput()+ json_decode(),否则签名校验必然失败。



















