命令行生成中间件最可靠:php think make:middleware AuthCheck 自动生成 app/middleware/AuthCheck.php,类名 AuthCheck,命名空间 app\middleware;必须实现 public function handle($request, \Closure $next) 方法,注册需在 app/middleware.php 返回数组中配置完整类名或已定义别名,且注意执行顺序对 Session、Cookie 等依赖的影响。

用命令行生成中间件最可靠
手动新建文件容易写错命名空间、类名或目录路径,直接执行命令就行:php think make:middleware AuthCheck。它会自动生成 app/middleware/AuthCheck.php,类名为 AuthCheck,命名空间固定为 app\middleware,无需你手敲。
如果你改过应用目录结构(比如用了多应用模式),命令仍会按当前 app/ 路径生成;若想生成到特定应用下(如 app/admin/middleware/),得手动建文件并确保命名空间匹配该目录层级。
中间件类必须实现 handle() 方法
ThinkPHP 只认 handle() 作为入口,其他方法名(如 process()、run())完全无效。签名也必须严格是:public function handle($request, \Closure $next)。
-
$request是\think\Request实例,不是原生$_GET或$_POST -
$next是闭包,必须调用并返回其结果,否则请求链中断:return $next($request); - 若需提前终止请求(如跳转登录页),返回
\think\Response实例,例如:return redirect('user/login');
中间件注册后才生效,不注册等于没写
app/middleware.php 是唯一全局注册入口,这个文件必须存在、必须返回数组、不能有 echo 或 var_dump 输出,否则整个中间件栈失效。
立即学习“PHP免费学习笔记(深入)”;
注册方式只接受两种形式:
- 完整类名:
\app\middleware\AuthCheck::class(TP6/8 推荐) - 字符串别名(前提是已在
config/middleware.php的alias中定义):'auth'
常见错误:只在路由里写 ->middleware('auth'),但没在 app/middleware.php 或 config/middleware.php 中映射,运行时抛出 Middleware not found: auth。
别把中间件当控制器用,生命周期很关键
中间件在控制器之前执行,但很多依赖(如 Session 初始化、Request 的 param() 解析)还没完成。这时候直接调用 session('user_id') 或 $request->param('id') 很可能为空或报错。
稳妥做法:
- 读 Session 优先用
\think\facade\Session::get('key') - 取参数用
$request->get('id')或$request->post('name'),别依赖param() - 需要操作响应对象时,确保返回的是
\think\Response实例,不是字符串或数组
真正容易被忽略的点是:中间件顺序决定数据可读性。比如你想用 Cookie 切语言,Lang 中间件就必须排在 SessionInit 之后——早了读不到 Cookie,晚了又错过语言加载时机。



















