ThinkPHP多应用模式下中间件不继承是设计使然,每个子应用(如admin、api)必须单独配置middleware.php,根目录app/middleware.php被忽略,路由分组需显式绑定中间件且用完整命名空间。

ThinkPHP多应用模式下中间件不继承是设计使然,不是配置错误
TP6+ 多应用(如 app/admin、app/api)默认不共享中间件,因为每个应用被视为独立服务单元——框架不会自动合并、覆盖或继承根目录 app/middleware.php 的配置。你看到的“没生效”,大概率是误以为子应用会自动加载全局中间件。
多应用中间件必须单独注册到对应应用的 middleware.php
在启用 APP_MULTI_MODULE 后,框架只加载当前请求对应应用目录下的中间件注册文件:
-
app/admin/middleware.php仅对/admin路由生效 -
app/api/middleware.php仅对/api路由生效 - 根目录
app/middleware.php在多应用模式下被完全忽略(除非你手动在各子应用中 require 它)
常见错误:只改了根目录 app/middleware.php,结果 /admin 请求压根不走这个文件。
路由分组里 middleware() 不会跨应用自动绑定
即使你在 app/admin/route.php 里写了分组,也必须显式调用 middleware(),否则中间件不执行:
立即学习“PHP免费学习笔记(深入)”;
Route::group('admin', function () {
Route::get('user', 'UserController@index');
})->middleware(\app\admin\middleware\AuthCheck::class); // 必须写这一行
注意点:
- 类名必须带完整命名空间:
\app\admin\middleware\AuthCheck::class,不能只写AuthCheck::class - 中间件文件必须放在
app/admin/middleware/AuthCheck.php,不能放app/middleware/下 - 嵌套路由分组不继承外层中间件,每层都得单独
->middleware()
为什么不用继承?性能与隔离性优先
强制分离中间件是为避免隐式耦合:
- 后台管理需要权限校验、操作日志,API 可能只需要 CORS 和限流,混在一起易出错
- 子应用可独立部署(如
app/api单独打成 Docker 镜像),中间件配置必须自包含 - 框架启动时只扫描当前应用目录,不递归加载,减少反射开销和路径冲突风险
最常被忽略的一点:多应用下,app/middleware.php 文件本身可以删掉,只要每个子应用都有自己的 middleware.php 并返回合法数组即可。



















