ThinkPHP 5.x 是唯一稳定支持 Route::domain() + 闭包写法的版本;TP6+ 受限,TP8 报错。Route::domain() 第二参数仅接受闭包或数组,不支持字符串路径,其作用是划分域名作用域而非跳转目标。

ThinkPHP 5.x 是唯一能稳定用 Route::domain() + 闭包写法的版本;TP6+ 已不支持或严重受限,TP8 直接报错。
为什么 Route::domain('admin.example.com', 'admin/index/index') 会报错
这个写法在 TP5 中就非法:因为 Route::domain() 第二个参数只接受闭包函数或路由定义数组,不接受字符串路径。框架会直接抛出 Invalid route rule。
常见错误来源是把普通路由写法(Route::get('a', 'b/c/d'))套用到域名绑定上,但二者语义完全不同。
-
Route::domain()的作用是「划分域名作用域」,不是「跳转目标」 - 闭包内才真正定义该域名下所有可访问的子路径
- 字符串写法仅适用于模块/控制器绑定(见下个副标题)
Route::domain() + 闭包的正确写法(TP5.0–5.1)
必须用闭包包裹子路由,且闭包内部使用标准 Route::get()、Route::resource() 等定义方式:
立即学习“PHP免费学习笔记(深入)”;
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
Route::domain('api.example.com', function () {
Route::get('v1/user', 'api/v1.User/get');
Route::post('v1/order', 'api/v1.Order/create');
Route::rule('v1/:controller/:action', 'api/v1.:controller/:action');
});
注意点:
- 闭包里所有路由自动限定在
api.example.com下,无需再拼前缀 - 控制器类名需带完整命名空间(如
api/v1.User),否则找不到类 - 闭包中不能用
$this,也不能直接调用input()或session()—— 要用\think\Request::instance()->param()或\think\Session::get() - 如果想复用已有路由文件,可用
require返回数组:Route::domain('m.example.com', require 'route/mobile.php');,但mobile.php必须return [];
更轻量的替代方案:直接绑定域名到模块(不用闭包)
如果只是想让某个域名固定走某个模块,不用精细控制子路径,用字符串绑定最简:
Route::domain('blog.example.com', 'blog');
Route::domain('admin.example.com', 'admin');
效果:
- 访问
http://blog.example.com/article/read/id/5→ 自动映射到blog/article/read操作 - 访问
http://admin.example.com/user/list→ 映射到admin/user/list - 这种写法不经过路由解析器,性能略高,且兼容 TP5–TP8 全系列
- 但缺点是无法对子路径做重写、正则约束或权限中间件绑定
闭包路由在 TP5 中也容易踩的坑
即使在 TP5,闭包路由也不是“随便写就能跑”:
-
php think route:list永远看不到闭包定义的路由 —— 它无法序列化,调试时等于盲操作 - 闭包内引用模型必须用全限定名:
\app\model\User::find(1),写User::find(1)会去加载think\facade\User - 部署到 Swoole 或 RoadRunner 时,闭包会因不可序列化导致启动失败:
Serialization of 'Closure' is not allowed - 多应用模式下,所有域名路由仍必须统一写在
route/app.php,不能按应用拆分到app/xxx/route.php
实际项目中,除非是极简 API 或临时调试,否则建议用「控制器 + 域名绑定」代替闭包,既可被 route:list 识别,又避免常驻内存环境下的序列化问题。


















