多应用模式下中间件需按应用独立注册加载:每个应用必须在自身app/{name}/middleware.php中以数组形式声明中间件类,命名空间须与应用目录严格对应(如app\admin\middleware),文件名大小写敏感,且必须显式return响应对象。

多应用模式下,中间件不是全局配一次就完事的——每个应用必须独立注册、独立加载,否则 app/admin/middleware/AdminAuth.php 这类文件根本不会被触发。
中间件文件必须放在对应应用目录下的 middleware/ 子目录里
ThinkPHP 8.0 多应用(如 admin、api)不认全局 app/middleware.php 里写的路径映射。它只扫描当前应用目录下的 middleware/ 文件夹,并按命名空间自动加载。
-
app/admin/middleware/AdminAuth.php的命名空间必须是app\admin\middleware,不能写成app\middleware - 同理,
app/api/middleware/ApiAuth.php命名空间得是app\api\middleware,否则handle()方法不会执行 - 如果手误把中间件放到了
app/common/middleware/,即使命名空间对,也不会被当前应用识别
中间件注册必须在应用级 middleware.php 中完成
每个应用需有自己的 middleware.php 配置文件,路径为 app/{app_name}/middleware.php(例如 app/admin/middleware.php),内容是数组形式的中间件列表,不是键值对。
- 正确写法:
return [ \app\admin\middleware\AdminAuth::class, ]; - 错误写法:用键名(如
'auth' => \app\admin\middleware\AdminAuth::class)——这仅适用于全局配置,多应用下会被忽略 - 该文件必须存在,哪怕只写
return [];;若缺失,整个应用的中间件链将为空
中间件执行顺序由注册位置和路由绑定共同决定
ThinkPHP 8.0 多应用中,中间件生效有三层优先级:应用级配置 > 路由级绑定 > 控制器级声明。但要注意,应用级注册的中间件默认是「前置全局」,会拦截所有请求,包括静态资源和未定义路由。
- 想只对某组路由生效?改用路由绑定:
Route::group(['prefix' => 'admin'], function () { /* ... */ })->middleware(\app\admin\middleware\AdminAuth::class); - 控制器内声明
$middleware属性,只对当前控制器方法起作用,但注意:它不会覆盖应用级中间件,而是追加到链尾 - 多个中间件注册时,数组顺序即执行顺序,靠前的先执行、先结束(比如日志中间件放前面,鉴权放后面)
调试中间件不生效时,优先检查 Request 对象是否被修改或提前返回
常见静默失败场景:中间件里调用了 redirect() 或 json() 后没 return,导致后续逻辑继续执行,最终返回空响应或报错 headers already sent。
- 务必在所有分支里显式
return响应对象,例如:return redirect('/admin/login');,不能只写redirect(...); - 调试时可在
handle()开头加var_dump($request->url()); die;,确认是否进入中间件 - 注意
$next($request)必须被调用且返回,漏掉这句会导致后续控制器完全不执行
最容易被忽略的一点:中间件类名和文件名必须严格一致(大小写敏感),Linux 服务器上 Adminauth.php 和 AdminAuth.php 是两个文件,命名空间写对也没用——框架按文件名自动加载,不匹配就跳过。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











