ThinkPHP多应用模式需四步协同:安装think-multi-app扩展、手动创建规范应用目录、显式导入各应用路由、在入口文件绑定应用。缺一即导致404或类未找到错误。

必须安装并启用 think-multi-app 扩展
TP6.1+ 默认不支持多应用,topthink/think-multi-app 是硬性依赖,没它整个流程直接失效。
- 执行
composer require topthink/think-multi-app安装扩展 - 确认
config/app.php中存在'app_multi_module' => true - 检查
providers数组是否包含\think\multi\AppServiceProvider::class;若没有,手动追加 - 运行
php think service:discover确保服务提供器被识别
必须手动创建规范的应用目录结构
框架不会自动生成 app/admin、app/api 这类目录——你得亲手建,或用命令生成,且命名和内容必须严格合规。
- 用命令创建:
php think app:create admin(生成app/admin/及其完整子结构) - 应用名只能是小写字母 + 下划线,如
admin、user_v2;Admin、user-api会失败 - 删掉原始的
app/controller目录——这是单应用残留,不删会导致框架强制降级 - 检查
app/admin/config/app.php中的'app_namespace' => 'app\admin',命名空间必须与目录名完全一致
必须在全局 route.php 中显式导入各应用路由
TP6 不会自动扫描 app/*/route.php,不手动 import,子应用的路由文件就是死文件。
- 编辑
config/route.php,在 return 数组前加入:use think\facade\Route; - 添加导入语句:
Route::import('admin', 'admin');(第二个参数大小写敏感,必须与目录名一致) - 每个新增应用都要追加一行,比如
Route::import('api', 'api'); -
app/admin/route.php内部只需写实际路由,不要套Route::group('admin', [...]),否则路径变双重复
必须在入口文件中完成应用绑定
config/app.php 中的 domain_bind 在多应用模式下完全无效,绑定动作必须落在 public/index.php 里。
立即学习“PHP免费学习笔记(深入)”;
- 在
require __DIR__ . '/../vendor/autoload.php';之后、App::run()之前插入绑定逻辑 - 按域名绑定示例:
if ($_SERVER['HTTP_HOST'] === 'admin.example.com') { \think\App::bind('admin'); } - 按子目录识别需自行解析 PATH_INFO,但更推荐域名直绑,逻辑清晰不易错
- 绑定后,后续所有加载(配置、路由、视图路径、runtime 目录)都基于该应用上下文



















