route::import() 必须显式调用,否则子应用路由不生效;需在app/route/app.php中导入且参数与子目录名严格一致,同时删除app/controller目录并正确绑定域名。

Route::import() 不调用,子应用路由就是死文件
ThinkPHP 8.0/6.x 多应用模式下,app/admin/route/app.php 这类文件不会被自动扫描加载——框架压根不查这个路径。你写得再全,没调 Route::import('admin', 'admin'),它就永远不生效,访问 /admin/login 必然 404,且不报任何错误。
常见错误现象:
- 明明
app/admin/route/app.php存在且语法正确,但php think route:list里完全看不到 admin 相关路由 - 访问子应用 URL 返回 404,检查控制器、命名空间都对,最后发现是漏了导入语句
- 在 Swoole 模式(
php think swoole)下,只认app/route/app.php里的Route::import(),其他地方写的全忽略
实操建议:
- 所有导入必须写在
app/route/app.php(或config/route.php,取决于项目结构),不能分散到子应用路由文件里 - 第二个参数必须和子目录名**完全一致**:
'admin'对应app/admin,'api_v2'对应app/api_v2,大小写、下划线、中横线都不能错 - 删掉原始的
app/controller目录——只要它存在,框架强制降级为单应用模式,Route::import()全部失效
app/controller 目录残留导致多应用静默失效
这是最隐蔽也最常被忽略的一环:只要 app/controller 这个目录还存在,无论你配了多少 auto_multi_app、写了多少 Route::import(),框架都会直接跳过所有多应用逻辑,当成单应用跑。
它不会报错,也不会提示“检测到单应用结构”,只是默默忽略 app/admin 等子目录,所有子应用路由全部失效。
实操建议:
- 执行
rm -rf app/controller(Linux/macOS)或手动清空app/下所有默认生成的平铺目录(controller、model、view) - 确认
app/下只有子应用目录(如admin、api),且每个子目录内含controller/、route/app.php、config/ - 检查
config/app.php中'app_namespace' => 'app'是否设置,否则app\admin\controller\Index类无法自动加载
域名绑定与入口文件里的 App::bind() 缺一不可
仅靠 Route::import() 不足以让 admin.example.com/login 路由到 admin 应用——URL 域名识别和应用绑定是两件事。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
ThinkPHP 不会根据 Host 自动切换应用,必须在入口文件里硬编码绑定:
if ($_SERVER['HTTP_HOST'] === 'admin.example.com') { \think\App::bind('admin'); }
常见错误现象:
- 子应用路由已导入,
php think route:list --name=admin能看到路由,但访问域名仍进 index 应用 - 用了泛域名或本地 hosts 测试时,
$_SERVER['HTTP_HOST']值和判断条件不匹配(比如带端口admin.test:8080)
实操建议:
- 绑定逻辑必须加在
public/index.php中autoload.php加载之后、App::run()之前 - 测试阶段可用
$_SERVER['REQUEST_URI']或$_GET['app']临时绕过域名判断,但上线必须用真实域名绑定 - 若用 Nginx 反向代理,注意是否透传了
Host头,否则$_SERVER['HTTP_HOST']可能是上游地址
命名冲突和闭包路由覆盖问题容易被忽略
子应用路由导入后,不同应用间如果用了相同 ->name(),或在同一个 Route::group() 里混用闭包和控制器路由,会导致静默覆盖——旧路由失效,前端调用直接 404,排查极难。
例如:Route::get('login', 'Index/login')->name('login'); 和 Route::get('login', function(){...})->name('login'); 同时存在,后者会被前者覆盖,且无警告。
实操建议:
- 所有路由必须显式设
->name(),用层级命名:如admin.login、api.v1.user.list - 执行
php think route:list检查 Name 列是否有空值,空值路由无法用url()生成链接 - 闭包路由必须加独立前缀(如
dev.ping),禁止和控制器路由共用 name -
app/admin/route/app.php里不要套Route::group('admin', [...]),否则 URL 变成/admin/admin/login
app/controller 多留一个空文件夹,App::bind() 少写一行,Route::import() 参数大小写差一个字母,整个子应用就彻底失联。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










