ThinkPHP多应用模式下,admin应用中间件必须放在app/admin/middleware/目录、命名空间为app\admin\middleware,并在app/admin/middleware.php中注册完整类名;路由需显式调用->middleware()才生效,Lang中间件须在SessionInit之后注册且语言配置须正确。

admin应用中间件文件必须放在 app/admin/middleware/ 目录下
ThinkPHP 多应用模式下,admin 是独立应用,它的中间件不会从 app/middleware/ 加载,也不会识别全局 app/middleware.php 里的配置。你得把中间件类明确放到 app/admin/middleware/AuthCheck.php,且命名空间必须是 app\admin\middleware。
常见错误包括:
- 手写文件却放错路径,比如丢进
app/middleware/auth/—— 框架压根不扫描子目录 - 用
php think make:middleware AuthCheck生成后没手动挪到app/admin/middleware/,还沿用默认命名空间app\middleware - 文件开头有 BOM、
echo、注释外空行或 UTF-8 编码异常,导致app/admin/middleware.php加载时报错或静默失败
admin 应用的中间件注册入口是 app/admin/middleware.php
这个文件是 admin 应用专属的中间件注册点,不是全局的 app/middleware.php。它必须存在、必须返回数组、数组元素必须是完整类名字符串(带命名空间)。
正确写法示例:
return [
\app\admin\middleware\AuthCheck::class,
'app\admin\middleware\Lang',
];
注意:
- 不能写成
AuthCheck::class(缺命名空间)或'AuthCheck'(字符串未解析) - 不能删掉这个文件,也不能改成
middleware_admin.php等非标准名 - 如果里面写了
echo 'debug';或return null;,整个应用中间件系统会失效,请求可能直接 500 或跳过所有中间件
路由级绑定要显式调用 ->middleware(),不能只靠注册
即使你在 app/admin/middleware.php 里注册了 AuthCheck,它也不会自动生效——那是全局中间件行为。在 admin 应用内,你仍需在路由定义中显式挂载:
// app/admin/route.php
use think\facade\Route;
Route::get('user/profile', 'user/profile')->middleware(\app\admin\middleware\AuthCheck::class);
或者用别名方式(需先在 config/middleware.php 中配 alias):
'alias' => [
'auth' => \app\admin\middleware\AuthCheck::class,
],
然后路由里写:->middleware('auth')。
关键点:
- 不链
->middleware(),中间件就完全不执行 - 别名必须在
config/middleware.php定义,app/admin/middleware.php里只认类名或已定义别名 - 若用
Route::group(),中间件要写在 group 外层或闭包内,否则不生效
多应用下 Lang 中间件要单独注册并控制顺序
如果你在 admin 应用里用多语言,think\middleware\Lang 也得在 app/admin/middleware.php 里单独注册,且必须排在 SessionInit 类之后(如 think\middleware\SessionInit),否则读不到 cookie('think_lang')。
典型顺序应为:
return [
\think\middleware\SessionInit::class,
\think\middleware\Lang::class, // 必须在这之后
\app\admin\middleware\AuthCheck::class,
];
同时确认 config/app.php 中以下配置已启用且为布尔值:
'lang_switch_on' => true'default_lang' => 'zh-cn''lang_list' => ['zh-cn', 'en-us']
语言包路径必须严格为 lang/zh-cn/common.php,大小写和短横线一个都不能错;handle() 开头就要调用 \think\Lang::setLang($lang),晚了就无效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











