多应用模式下中间件不生效,主因是注册位置错误、命名空间未对齐或未启用多应用扩展;需安装think-multi-app、开启app_multi、各子应用独立配置middleware.php并严格匹配命名空间。

中间件在多应用模式下不生效,基本是注册位置错了、命名空间没对齐、或者根本没启用多应用扩展——不是框架不支持,是配置链断在了启动前。
确认是否已安装并启用多应用扩展
ThinkPHP 6 默认不带多应用功能,必须手动装扩展:
- 运行
composer require topthink/think-multi-app安装扩展 - 检查
config/app.php中'app_multi' => true已开启 - 确认
app/下存在子目录(如app/admin/),且结构完整(含controller/、config/、middleware.php) - 若用 Swoole 或 RoadRunner,需确保扩展类能被自动加载;否则启动时会静默跳过中间件注册
中间件文件必须放在对应子应用目录下
全局 app/middleware.php 对多应用无效,每个子应用必须有自己独立的中间件配置文件:
- 前台应用中间件写在
app/index/middleware.php,返回数组如['app\index\middleware\AuthCheck'] - 后台应用中间件写在
app/admin/middleware.php,类文件必须在app/admin/middleware/AuthCheck.php - 命名空间必须与路径严格一致:
app\admin\middleware,不能漏掉admin\段 - 别把中间件类塞进子目录(如
app/admin/middleware/auth/AuthCheck.php),框架只扫描app/{app_name}/middleware/一级目录
路由中间件必须显式绑定,且类名要可解析
即使中间件已注册,路由层仍需手动挂载,且语法不能错:
- 在
app/admin/route/app.php中写:Route::get('user', 'User/profile')->middleware('auth') - 这里的
'auth'必须和app/admin/middleware.php中的键名一致(如'auth' => \app\admin\middleware\AuthCheck::class) - 不能直接传类名字符串(如
->middleware('AuthCheck')),除非该类已通过app/admin/middleware.php映射为短名 - 若用闭包写路由中间件,必须带类型提示:
function (\think\Request $request, \Closure $next),否则框架无法识别
Session 共享失效?先看 SessionInit 中间件有没有启用
多应用下登录态丢失,大概率不是中间件没跑,而是 Session 根本没初始化:
- 检查
app/admin/middleware.php是否包含\think\middleware\SessionInit::class - 确认
config/session.php中'prefix' => ''(空 prefix 才能跨应用共享) -
'type'推荐设为redis,并确保所有子应用共用同一 Redis 实例和 DB - Nginx 配置中需透传 Cookie 域:如
cookie_domain => '.example.com',前端 AJAX 要加credentials: 'include'
多应用中间件最易忽略的点:它不继承全局配置,也不靠自动扫描——每个子应用都是独立容器,连 middleware.php 文件都得手动建、手动填、手动核对命名空间。少一个反斜杠,就等于没写。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











