thinkphp 6 多应用需目录结构(如app/admin)、入口绑定(app::bind())和显式路由导入(route::import('admin', 'admin'))三者协同;app_multi=true仅为开关,不自动识别路径或域名,缺一不可。

ThinkPHP 6 的多应用模式不是“开了配置就自动分发”,而是靠目录结构 + 入口绑定 + 路由显式导入三者协同生效;app_multi = true只是开关,不等于路由自动识别路径或域名。
多应用目录结构必须手动创建,不能只改配置
TP6 不会根据 app_multi = true 自动把 app/controller/Index.php 拆成多个应用。你得在 app/ 下真实建出子目录,比如 app/admin、app/api,每个目录内至少包含:
-
controller/目录(控制器类必须按命名空间匹配,如app\admin\controller\Index) -
route.php(哪怕为空,缺了会报App not exists: admin) -
config/目录(可空,但若要差异化配置,需放同名文件如database.php)
应用名只能是小写字母+下划线,app/user-v2 或 app/Admin 都会导致路由解析失败或类加载报错。
子应用路由不会自动加载,必须用 Route::import()
即使你建好了 app/admin/route.php,它也不会被框架自动读取。全局路由入口 config/route.php 必须显式调用:
use think\facade\Route;
Route::import('admin', 'admin'); // 第一个参数是别名(可选),第二个是应用名
Route::import('api', 'api');
漏掉这一句,访问 /admin/login 就会 404——因为框架根本没加载 app/admin/route.php 里的任何规则。
常见错误:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 在
app/admin/route.php里写了Route::get('login', ...),但没在全局config/route.php中import,路由不生效 - 误以为
Route::import('admin')就够了,实际第二个参数必须是应用名字符串,否则加载路径错乱 - 新增应用后忘了追加
Route::import(),导致新模块路由完全不可达
域名或子域名绑定必须在入口文件做,config/app.php 的 domain_bind 无效
TP6 多应用下,config/app.php 里的 'domain_bind' => ['admin.example.com' => 'admin'] 完全被忽略。真正起作用的是 public/index.php 中的 \think\App::bind():
if ($_SERVER['HTTP_HOST'] === 'admin.example.com') {
\think\App::bind('admin');
}
// 必须在 App::run() 之前,且不能晚于 autoload.php 加载之后
这个绑定决定了后续整个请求生命周期使用哪个应用的 route.php、config/ 和命名空间。如果绑错了,或者没绑定,就会 fallback 到默认应用(通常是 index),造成模板找不到、配置读错、中间件不生效等问题。
注解路由在多应用下默认不扫描子目录,需改 annotation.php
装了 topthink/think-annotation 后,默认只扫描 app\controller 命名空间。而 app/admin/controller 对应的是 app\admin\controller,不在默认范围内。
必须修改 config/annotation.php 中的 scan_namespaces:
'scan_namespaces' => [
'app\controller',
'app\admin\controller',
'app\api\controller',
],
否则 #[Route] 注解在 app/admin/controller 下完全不被识别,连 php think route:list 都看不到对应路由。
容易忽略的一点:PHP 8 的 Attribute 语法(#[Route])和旧版注释语法(/** @Route */)不能混用,且扩展版本需匹配 TP 版本;TP8 默认只认 Attribute,TP6 则需确认扩展是否启用了兼容模式。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










