TP5.1多模块无法平滑迁移至TP6多应用,因二者机制完全不兼容:目录结构、命名空间、路由解析、配置作用域均重写,硬改配置必报Class not found或AppNotFoundException。

不能直接升级,必须重装框架 + 重构目录结构 + 补全扩展依赖。TP6 的多应用模式和 TP5.1 的多模块(module)是两套完全不兼容的机制,app/ 目录结构、命名空间解析、路由加载逻辑、配置作用域全部重写过。硬改配置或复制文件只会卡在 Class not found 或 AppNotFoundException。
为什么 TP5.1 的多模块不能平滑迁移到 TP6 多应用
TP5.1 的 module 是单应用下的逻辑分组,所有模块共享同一个 app\controller 命名空间前缀,路由靠 route.php 的分组规则识别;而 TP6 多应用要求每个子应用是独立的命名空间(如 app\admin\controller)、独立的 config/ 和 route/ 目录,且必须由 think-multi-app 扩展驱动。两者连入口解析阶段就分道扬镳了。
- TP5.1 的
application/admin/controller在 TP6 中不会被自动识别为应用,框架压根不扫描该路径 -
config/app.php里的module_allow_list、default_module等配置项在 TP6 中已废弃,设了也无效 - TP5.1 路由中写的
admin/index/index在 TP6 多应用下会被解析成「应用名=admin,控制器=index,方法=index」,但若没装扩展或没清空原始app/controller,直接 404
必须执行的四步重建动作
这不是配置调整,而是项目骨架级改造:
- 在项目根目录运行
composer create-project topthink/think:6.0.0(注意指定 6.0.x 版本),生成干净的 TP6 环境;不要试图在原 TP5.1 项目上composer update - 把原 TP5.1 的
application/下各模块代码(如admin/、api/)按功能拆解,只提取业务逻辑类(Model、Service)、视图模板、静态资源;控制器、路由、配置必须重写 - 安装多应用扩展:
composer require topthink/think-multi-app,并确认composer show topthink/think输出是6.x(如6.3.5),不是8.x或5.1.x - 删掉新项目的
app/controller目录(哪怕它是空的),然后用php think build admin、php think build api逐个生成标准子应用结构——这一步强制建立正确的命名空间和目录契约
关键配置与常见踩坑点
TP6 多应用不认 TP5.1 那套配置习惯,以下三项必须手敲、不能抄:
立即学习“PHP免费学习笔记(深入)”;
-
APP_MULTI_MODULE常量必须在public/index.php的autoload.php加载前定义,写在config/app.php里无效;漏写会导致所有子应用路由解析失败 - 每个子应用的
app/admin/config/app.php必须存在,且至少包含'app_namespace' => 'app\admin',否则控制器实例化时命名空间错乱 - TP5.1 的全局
route.php不再生效,每个子应用的路由必须放在app/admin/route/下,且文件内不能写带应用名的完整路径(如/admin/index/index),只写index/index—— 应用名由入口或域名绑定决定 - 如果沿用域名访问(如
admin.example.com),config/app.php的domain_bind数组必须用小写二级域名作键('admin' => 'admin'),大写或带点号会触发InvalidArgumentException
最易被忽略的是:TP6 多应用下,子应用之间默认完全隔离,app\admin 无法直接 new app\index\model\User,跨应用调用需显式 use 全限定命名空间,或统一抽到 extend/ 下。这点在迁移后台管理调用前台用户模型时极易爆错。



















