Hyperf 的 Router::addGroup() 用于路由分组,需传入以 / 开头的前缀字符串和闭包回调,闭包内路由路径自动拼接前缀;中间件须通过返回对象链式调用 middleware() 添加;不支持统一 pattern/ext,需正则占位符或中间件实现;控制器类名必须完整可加载,不继承命名空间。

Hyperf 的 Router::addGroup() 怎么用
Hyperf 路由分组靠 Router::addGroup(),不是 group()(那是旧版或其它框架的写法)。它接收两个参数:前缀字符串(必须以 / 开头)和闭包回调。闭包里定义的路由路径会自动拼上前缀。
常见错误是漏掉前缀开头的斜杠,或把闭包写成数组——addGroup('/api', [...]) 直接报错,必须是函数。
-
Router::addGroup('/api', function () { Router::get('/users', 'App\Controller\UserController::list'); });→ 实际匹配/api/users -
Router::addGroup('api', ...)→ ❌ 前缀没/,注册后变成api/users,请求/api/users404 -
Router::addGroup('/api', ['App\Controller\UserController::list'])→ ❌ 第二个参数必须是callable,PHP 报TypeError
中间件怎么统一加到整个分组
中间件不能塞进闭包里“顺手加”,也不能靠配置文件全局挂载——必须通过 addGroup() 返回的对象链式调用 middleware() 方法。
这是因为 addGroup() 内部返回的是一个可继续链式操作的路由组对象,而闭包里的单条路由只是独立注册,不继承外层上下文。
-
Router::addGroup('/admin', function () { Router::get('/dashboard', 'App\Controller\AdminController::index'); })->middleware([App\Middleware\AuthMiddleware::class]);→ ✅ 全组生效 -
Router::addGroup('/admin', function () { Router::get('/dashboard', '...', ['middleware' => [...]]); });→ ⚠️ 只对这一条生效,且易误判为全组受控 - 中间件类名必须能被自动加载,比如
App\Middleware\AuthMiddleware::class对应文件app/Middleware/AuthMiddleware.php,否则启动时报Class not found
分组里怎么统一设变量规则和 URL 后缀
Hyperf 不像 ThinkPHP 那样支持 ->pattern() 或 ->ext() 这类链式方法。它的约束得靠 FastRoute 原生能力,在路由定义时用正则占位符显式声明,后缀则需配合 Router::addRoute() 的 $options 参数或中间件解析。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
也就是说:Hyperf 分组本身不提供批量 pattern/ext 的 API,所谓“统一设置”其实是靠约定 + 中间件兜底。
- 路径中强制数字 ID:
Router::get('/user/{id:\d+}', '...'),而不是{id}放开匹配 - 想让
/api/users.json自动识别为 JSON 响应?得写中间件检查Request::getUri()->getPath()是否以.json结尾,再手动设response->withHeader('Content-Type', 'application/json') - 若坚持用后缀路由,建议在
config/autoload/middlewares.php里全局注册一个UrlSuffixMiddleware,统一处理.json、.xml等后缀逻辑
嵌套分组和命名空间怎么避免控制器找不到
Hyperf 的 addGroup() 不自动继承命名空间,也不会帮你补全控制器类名。闭包里写的 'App\Controller\UserController::list' 必须完整、可 autoload,没有缩写或相对写法。
有人误以为外层分组能“带入”命名空间前缀,结果写成 'UserController::list',直接报 Class UserController does not exist。
- ✅ 正确写法:
Router::addGroup('/api/v2', function () { Router::get('/users', 'App\Controller\V2\UserController::list'); }); - ❌ 错误写法:
Router::addGroup('/api/v2', function () { Router::get('/users', 'V2\UserController::list'); });(缺少App\Controller\) - ⚠️ 注解方式更省心:
#[Controller(prefix: '/api/v2')]类上加注解,方法用#[GetMapping('/users')],框架自动拼全命名空间
真正容易被忽略的点是:Hyperf 的路由分组不管理命名空间、不处理后缀、不内置变量校验——它只做路径拼接。所有“统一行为”都得靠你主动加中间件、写完整类名、或换用注解驱动。别指望一个 addGroup() 调用就搞定权限、格式、版本三件事。


















