Hyperf的Router::addGroup()必须显式传入prefix选项才能生效,否则分组路径不参与路由拼接;正确写法为Router::addGroup('/api/v1', function(){...}, ['prefix' => '/api/v1'])。

Hyperf 路由分组前缀用 prefix 参数
Hyperf 的 Router::addGroup() 不支持直接在路径字符串里写前缀(比如 '/api/v1'),必须显式传入 prefix 选项,否则前缀不会生效。这是新手最容易漏掉的一点。
常见错误是这样写:
Router::addGroup('/api/v1', function () {
Router::get('/users', [UserController::class, 'index']);
});
// ❌ 实际注册的路由是 /users,不是 /api/v1/users
正确写法是:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
Router::addGroup('/api/v1', function () {
Router::get('/users', [UserController::class, 'index']);
}, ['prefix' => '/api/v1']); // ✅ 必须加这个
-
prefix值必须与分组路径字符串一致,否则会拼接出错(如写成'/v1'就变成/api/v1/v1/users) - 如果分组路径本身带斜杠结尾(
'/api/v1/'),prefix也得保持一致,否则可能触发双斜杠或 404 - 不传
prefix时,分组只起作用域隔离效果,不修改实际路由路径
Hyperf 2.x 和 3.x 的 prefix 行为一致
从 2.2 到 3.4,Router::addGroup() 对 prefix 的处理逻辑没变,但要注意配置方式是否混用了注解路由 —— 注解路由(@AutoController)的 prefix 是独立控制的,和 addGroup 无关。
- 注解路由的
prefix写在类或方法上,例如@AutoController(prefix="/api/v1") -
addGroup+prefix只影响该闭包内Router::get()等手动注册的路由 - 两者可以共存,但前缀不会叠加:注解路由不会被
addGroup的prefix影响,反之亦然
嵌套分组时 prefix 不自动继承
Hyperf 不支持嵌套分组自动拼接前缀。比如外层写了 prefix => '/api',内层再调用 addGroup('/v1', ...),内层必须自己再声明 prefix,否则前缀就断了。
Router::addGroup('/api', function () {
Router::addGroup('/v1', function () {
Router::get('/users', [UserController::class, 'index']);
}, ['prefix' => '/api/v1']); // ✅ 必须重写完整前缀
}, ['prefix' => '/api']);
- 不能简写成
['prefix' => '/v1'],那样注册的是/v1/users,不是/api/v1/users - 也不能依赖“外层 prefix 自动透传”,Hyperf 没这个机制
- 如果需要动态组合,建议提取成变量,避免硬编码重复
调试路由前缀是否生效的最快办法
运行 php bin/hyperf.php route:list 查看实际注册的路由表,重点核对 uri 列是否包含预期前缀。如果没出现,基本就是漏了 prefix 选项或值写错了。
- 注意区分
route:list输出里的name和uri:前者是路由名,后者才是真实访问路径 - 如果用了
Router::alias(),别误以为 alias 名就是 uri - 开发期建议配合
var_dump()或日志打点,在中间件里输出$request->getUri()->getPath(),确认进来的路径是否匹配你注册的 uri
route:list。


















