要在ThinkPHP6中实现前台、后台、API三套业务逻辑彻底隔离,必须完成四步闭环:安装think-multi-app扩展(composer require topthink/think-multi-app)、清空app/controller并用php think build生成子应用、配置app_multi_module=>true等核心项、在config/route.php中显式导入各子应用路由。

要在ThinkPHP6中让前台、后台、API三套业务逻辑彻底隔离运行,避免路由冲突、命名空间错乱和配置互相覆盖,必须完成扩展安装、目录重建、配置同步、路由显式导入四步闭环操作——漏掉任一环节都会导致Class not found或AppNotFoundException。
安装think-multi-app扩展
TP6核心包默认不带多应用能力,【composer require topthink/think-multi-app是硬性前提】。没装这个,php think build admin会报错Command "build" is not defined;app/下建了admin/目录也白搭,框架压根不识别。
在项目根目录执行命令:composer require topthink/think-multi-app。
安装后立即验证是否生效:运行composer show topthink/think-multi-app,有版本输出即表示扩展已载入。若无输出,说明未在正确目录执行,或composer缓存异常,需清理后重试。
立即学习“PHP免费学习笔记(深入)”;
【必须确认框架为TP6.x】运行composer show topthink/think,确保显示6.x版本(如6.3.5),若显示8.x或3.2.x,该配置将完全无效。
清空原始结构并生成子应用
只要app/controller存在,框架就会强制降级为单应用模式,app_multi_module => true也形同虚设。这一步操作起来很简单,直接把app/controller整个删掉就行。
删完后app/目录应为空,或仅保留config/app.php等配置文件。
使用框架内置命令生成标准子应用结构:php think build index → php think build admin → php think build api。
每个子应用名必须全部小写、不含短横线或下划线(admin✅,admin-v2❌,Admin❌)。build命令不会覆盖已有文件,但也不会自动补全子应用内缺失的config/app.php,需手动检查app/index/config/app.php是否存在。
生成后检查app/admin/controller/Index.php的命名空间是否为namespace app\admin\controller;——若仍为app\controller,说明build前未清空原始controller目录,需重新执行清理+build流程。
同步修改核心配置项
打开config/app.php,确认以下三项已设置:
'app_multi_module' => true,
'app_namespace' => 'app',
'default_app' => 'index',
其中app_namespace必须设为'app'(不是'app\controller'),否则访问/admin/index/index时会报Class not found;default_app设为'index'后,不带应用前缀的URL(如/)将默认指向前台应用。
别用think-swoole或TP8生态替代——它们已移除多应用支持。
显式导入子应用路由
即使你建好了app/admin/route.php,它也不会被框架自动读取。全局路由入口config/route.php必须显式调用Route::import()。
方法一:在config/route.php末尾添加:
use think\facade\Route;
Route::import('app/admin/route.php', 'admin');
Route::import('app/api/route.php', 'api');
第二个参数必须是应用名字符串,否则加载路径错乱。漏掉这一句,访问/admin/login就会404——因为框架根本没加载app/admin/route.php里的任何规则。
方法二:若使用分组路由方式,可在同一行写多个导入,但每个应用仍需独立指定应用名参数。
绑定域名或设置应用入口
TP6多应用下,config/app.php里的'domain_bind' => [...]完全被忽略。真正起作用的是public/index.php中的\think\App::bind()。
第一步:在public/index.php中,require __DIR__ . '/../vendor/autoload.php';之前插入:
if ($_SERVER['HTTP_HOST'] === 'admin.example.com') {
\think\App::bind('admin');
}
第二步:确保该绑定代码位于App::run()之前,且不能晚于autoload.php加载之后。
第三步:若使用localhost测试,需在hosts文件中添加映射,例如:127.0.0.1 admin.localhost。
绑定错了,或者没绑定,就会 fallback 到默认应用(通常是index),造成模板找不到、配置读错、中间件不生效等问题。



















