ThinkPHP多应用路由必须显式导入(Route::import('admin','admin'))、绑定应用名、路由地址不带应用前缀,否则404;子应用route.php需真实存在且命名合法,域名绑定须在domain_bind顶层声明或入口文件中App::bind()。

ThinkPHP多应用路由不是“写完就自动生效”,必须明确指定加载路径、绑定应用名、且路由地址里不能带应用前缀——否则 404 是默认结果。
多应用路由文件必须手动 import
app/admin/route.php 写得再完整,不显式导入就等于不存在。TP6/TP8 都不会自动扫描子应用的 route.php。
-
Route::import('admin', 'admin')必须写在全局config/route.php里,第一个参数是别名(可选),第二个参数是应用目录名,必须和app/admin的目录名完全一致(小写、无横线、无大写) - 漏掉这一句,访问
/admin/login会直接 404,错误提示可能是App not exists: admin或Controller not exists - 新增应用后,必须同步追加
Route::import(),CI/CD 流程中容易漏掉这步
路由地址里不能写应用名
你在 app/admin/route.php 里定义的路由,只管“应用名之后的部分”。比如想让 /admin/login 走到 app\admin\controller\Index 的 login 方法,路由要这么写:
Route::get('login', 'index/login');
而不是 'admin/index/login' 或 '\app\admin\controller\Index@login'(后者仅限闭包或特殊场景)。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 错误写法:
Route::get('login', 'admin/index/login')→ 找不到控制器,因为框架会去app\admin\controller\admin下找 - 正确写法:
Route::get('login', 'index/login'),对应命名空间app\admin\controller\Index - 若用类方法语法,必须写全限定名:
Route::get('login', '\app\admin\controller\Index@login')
域名绑定和入口绑定决定路由加载范围
路由能否被加载,取决于当前请求绑定的是哪个应用。没绑定,就默认走 index 应用,app/admin/route.php 根本不会被读取。
- 子域名绑定(如
admin.example.com)必须在config/app.php的domain_bind中声明,且该数组必须位于返回数组顶层,嵌套无效 - 本地开发用
localhost:8000时,domain_bind的 key 必须带端口:'localhost:8000' => 'admin' - 入口文件绑定更直接:
\think\App::bind('admin')必须在require autoload.php之后、$app->run()之前执行
注解路由在多应用下要改扫描范围
TP8 默认只扫 app\controller,app\admin\controller 不在范围内,注解路由不会生效。
- 安装
topthink/think-annotation后,需修改config/annotation.php中的scan_path,加上子应用路径:['app/controller', 'app/admin/controller', 'app/api/controller'] - 控制器方法上用 PHP 8 属性语法:
#[Route('login', method: 'GET')],不是旧版注释块 - 注解路由仍需配合
Route::import()或启用自动扫描(annotation_scan配置为 true),否则不触发解析
最常被忽略的一点:所有子应用的 route.php 文件必须真实存在(哪怕为空),缺一个就会报 App not exists;而 app/ 下任何非法命名的空目录(比如 App、user-v2)也会导致整个多应用初始化失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










