thinkphp 6 多模块需手动启用:设 app_multi => true,配置默认模块,注册模块路由;模块间逻辑隔离,共用代码须放 app/common/ 或 app/library/;模块中间件需单独配置;route:list 不显示模块前缀,调试需实际访问并检查 request->module()。

ThinkPHP 6 的模块不是靠目录硬拆出来的
默认安装的 ThinkPHP 6 不启用多模块,app 目录下只有一个 index 模块——这不是“单模块限制”,而是框架默认关闭了模块路由解析。想用多模块,必须手动开启,否则所有请求都只会进 index,哪怕你建了 admin、api 目录也没用。
- 开启方式:修改
config/app.php中的'app_multi' => true - 同时确保
'default_module' => 'index'设置合理(比如设为'admin'就会让根路径默认走 admin 模块) - 别漏掉
route/route.php里要注册模块路由,否则/admin/login会 404
模块间不能直接跨目录调用 Controller 或 Model
ThinkPHP 6 的模块是逻辑隔离的,app/admin/controller/User.php 和 app/api/controller/User.php 是两个完全独立的类,命名空间也不同:app\admin\controller\User vs app\api\controller\User。强行 require 或 new 实例会报错,因为自动加载器按命名空间找文件,不会跨模块扫描。
- 共用逻辑必须抽到
app/common/或app/library/下,用统一命名空间(如app\common\service\AuthService) - 模块内调用其他模块的 Service?可以,但得明确引入完整命名空间,不能依赖“当前模块上下文”
- 别在
app/admin/里写use app\index\model\User;——index模块的模型默认不被加载,除非你手动配置了模型的命名空间映射
app/middleware.php 是全局中间件,模块级中间件得单独配
很多人以为在 app/middleware.php 里注册一个中间件,它就会对所有模块生效。其实不然:全局中间件只作用于未指定模块的请求(比如 /),一旦 URL 带模块前缀(如 /admin/),框架会优先查找该模块自己的中间件配置。
- 模块级中间件放在
app/admin/middleware.php,内容格式和根目录一致,但只影响admin模块 - 如果 admin 需要鉴权、API 需要 CORS、index 需要游客缓存,就得各自维护三份中间件配置,不能图省事全塞进根目录
- 注意中间件执行顺序:全局 → 模块 → 控制器 → 方法,层级越深优先级越高
调试时 php think route:list 显示的路由不含模块名?
运行 php think route:list 看到的路由规则,路径都是 /login、/user/list 这种,没有 /admin/login ——这不是 bug,是命令行环境默认以 index 模块为上下文输出的。它不反映实际 HTTP 请求时的模块路由行为。
- 真实模块路由是否生效,得用浏览器或 curl 访问
http://localhost:8000/admin/login并看响应 - 检查模块是否识别成功,可在控制器里打印
$this->app->http->getName()(返回模块名)或$this->request->module() - 如果始终返回
index,大概率是app_multi没开,或者 Nginx/Apache 的 rewrite 规则没把路径第一段正确传给PATH_INFO
/admin/xxx 的 admin 提取出来喂给框架。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











