ThinkPHP 8 已移除多应用模式,改用“单应用+多模块+多入口”架构;TP6 多应用需配置 app_multi、独立入口及严格命名;TP8 通过模块化与路由分组模拟多应用行为。

多应用模式在 ThinkPHP 8 中已移除,别再找 multi-app 扩展
ThinkPHP 8 官方彻底放弃了多应用(multi-app)模式,think-multi-app 扩展不再兼容,强行安装会触发 Class 'thinkApp' not found 或路由初始化失败。这不是配置问题,是架构级废弃——TP8 的核心设计转向「单应用 + 多模块 + 多入口」,所有文档里还提“开启多应用”的,基本都过时了。
如果你手头是 TP6,那还能用;但只要 composer require 的是 topthink/framework:^8.0,就别折腾目录套目录了。
TP6 启用多应用的真实步骤:改配置 + 调整入口 + 注意命名规范
TP6 的多应用依赖 app/multi_app.php 配置和入口文件显式加载。不是加个开关就行,漏一步整个应用就找不到自己的 app 目录。
-
config/app.php中必须设置'app_multi' => true - 每个子应用(如
admin)需有独立入口文件(如public/admin.php),内容不能直接复制index.php,要改成:<?php // public/admin.php define('APP_NAME', 'admin'); require __DIR__ . '/../vendor/autoload.php'; (new thinkApp())->run()->send(); - 子应用目录名(如
app/admin)必须和APP_NAME值严格一致,大小写敏感,且不能含下划线 - 子应用的配置文件路径为
app/admin/config/app.php,不是app/admin/config.php
常见错误:请求进错应用、路由 404、跨应用模型调用失败
这些问题八成是因为入口没绑定对,或者混淆了「应用」和「模块」概念。TP6 的多应用本质是多个独立 App 实例共用一个框架内核,彼此隔离。
立即学习“PHP免费学习笔记(深入)”;
- 访问
/admin/却进了app/index?检查public/admin.php是否被 Web 服务器正确路由——Nginx 要配try_files $uri /admin.php?$query_string,Apache 要确保.htaccess指向对应入口 - 子应用里用
Db::name('user')报错?默认连接的是主应用的数据库配置,得在app/admin/config/database.php单独定义,不能指望继承 - 想在
admin应用里调用index应用的模型?不行。两个应用的容器完全隔离,app('index')->make(UserModel::class)会失败,只能走 API 或消息队列
TP8 替代方案:用多模块 + 多入口模拟多应用行为
TP8 不支持多应用,但你可以用模块化 + 独立入口 + 路由分组逼近等效效果,关键是放弃「每个应用一套 app/ 目录」的执念。
- 把
admin、api、wechat全放app/下作为模块:app/admin/controller/Index.php - 每个模块配专属入口(
public/admin.php),但加载的是同一个App实例,通过App::setNamespace('app\admin')切换根命名空间 - 路由文件按模块拆:
app/admin/route.php,并在入口中显式加载:Route::import(app_path('admin/route.php')) - 注意:模块间共享配置、中间件、事件监听器,若需隔离,得靠配置项前缀(如
admin.database.host)+ 动态读取
真正难的不是结构怎么搭,是搞清「哪些东西必须隔离(数据库连接、缓存前缀)、哪些可以复用(日志驱动、异常处理器)」——这个边界不画清楚,后面维护成本会指数上升。



















