ThinkPHP 6 默认支持多应用模式,需确认使用的是 6.x 版本;新增应用需在 app/ 下建子目录(如 admin),各应用需含 route.php 和 config.php,命名须小写无短横线,路由与配置独立生效,但中间件、事件、队列等跨应用场景需手动绑定。

ThinkPHP 6 默认就是多应用模式,不需要额外“开启”;如果你用的是 ThinkPHP 8(即 think-swoole 或新版 think-cli 生态),它已移除多应用支持——所以先确认你用的是 thinkphp/framework 6.x 版本(composer show topthink/think 查版本),否则后续配置全无效。
如何启用并划分多个应用目录
ThinkPHP 6 的多应用结构靠 app 目录下的子目录实现,每个子目录即一个独立应用。默认只有 app/common 和 app/index,其中 index 是主应用入口。
- 新增应用只需在
app/下新建目录,比如app/admin、app/api - 每个子目录内必须包含
config.php(可空)和route.php,否则运行时会报App not exists: admin - 应用名不能含短横线(
-)或大写字母,否则 URL 路由解析失败,例如app/user-v2会触发InvalidArgumentException - 若想让某个应用响应根域名(如
admin.example.com),需配合app/middleware.php中的Bind中间件绑定,而不是仅靠目录存在
怎么让不同应用走不同路由和配置
每个应用的 route.php 独立加载,互不影响;但公共配置(如数据库)默认继承自 config/app.php,要差异化就得用“应用级配置覆盖”。
- 在
app/admin/config/下新建同名文件(如database.php),其内容会自动合并覆盖全局config/database.php -
route.php中定义的路由只对该应用生效,但注意:如果启用了app/middleware.php中的AllowCrossDomain,它对所有应用都起作用,不能按应用开关 - 控制器命名空间必须匹配应用名,例如
app/admin/controller/Index.php的类必须是app\admin\controller\Index,否则抛出ClassNotFoundException - 模板路径默认为
view/[应用名]/,不手动改view_path配置的话,app/admin的模板得放在view/admin/下
常见 404 或 Class not found 错误怎么排查
多应用下最常遇到的不是配置错,而是自动加载和命名空间没对齐。
- 访问
/admin返回 404?检查app/admin/route.php是否有注册Route::get('/', 'Index/index'),且app/admin/controller/Index.php文件存在 - 报
Class app\admin\controller\Index does not exist?运行composer dump-autoload -o,因为 TP6 依赖 Composer 的 PSR-4 自动加载,新增应用目录后不会自动感知 - 命令行执行
php think route:list只显示index应用路由?说明其他应用的route.php没被扫描到——确认app/multi_app配置项为true(TP6.0.10+ 默认开启,旧版需手动设) - 使用
Url::build('@admin/index')报错?@admin是应用快捷前缀,但必须在app/admin/config/app.php中设置'app_name' => 'admin'才生效
多应用真正麻烦的不是建目录,而是中间件共享逻辑、事件监听器跨应用注册、以及队列任务里调用其他应用模型时的容器绑定——这些地方没有文档直说,得自己在 app/common/bootstrap.php 里手动 bind 实例,否则容易出现 DB 连接复用错乱或配置读取错包。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











