router::addroute是hyperf中唯一原生支持单条路由绑定多个http方法的api,需传入大写字符串数组(如['get','post']),配合路径和处理器,避免重复注册覆盖或维护割裂。

Router::addRoute 支持数组传入多个 HTTP 方法
Hyperf 的 Router::addRoute 是唯一原生支持单条路由绑定多个请求方法的 API。它不依赖注解或配置文件,直接在 config/routes.php 中调用即可生效。
常见错误是误用 Router::get() 或 Router::post() 多次注册同一路径——这会导致后注册的覆盖前一个,实际只保留最后一个方法。
- 正确写法:
Router::addRoute(['GET', 'POST'], '/user', [\App\Controller\UserController::class, 'handle']) - 方法名必须大写,且为字符串数组;小写(如
['get', 'post'])会被忽略 - 回调可为数组形式
[类名::class, 'method'],也可为闭包,但闭包内需自行判断$request->getMethod() - 若同时注册了
GET /user和POST /user两条独立路由,它们会共存,但无法共享中间件或参数解析逻辑,维护成本高
注解方式下 #[RequestMapping] 可指定 method 数组
使用 #[Controller] + #[RequestMapping] 时,method 参数接受字符串或字符串数组,这是最贴近 RESTful 风格且利于控制器内聚的写法。
注意:不要混用 #[GetMapping] 和 #[PostMapping] 到同一个方法上——它们是互斥的快捷注解,重复标注不会叠加,仅最后一个生效。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 支持写法:
#[RequestMapping(path: "/user", method: ["GET", "PUT"])] - 不支持写法:
#[GetMapping] #[PutMapping]同时修饰一个方法 -
method为空或未设置时,默认只匹配GET,不是“所有方法” - 如果想让一个方法处理多种方法但行为不同,建议在方法体内用
$this->request->getMethod()分支处理,而非强行塞进多个注解
为什么不用多个 Router::xxx() 调用同一路径
表面上看,Router::get('/x', ...) 和 Router::post('/x', ...) 看似能达成多方法效果,但实际存在三个隐性问题:
- 路由优先级冲突:当两个路由路径完全一致时,Hyperf 内部按注册顺序匹配,但中间件、参数绑定、分组前缀等配置不会自动合并,容易漏配
- OpenAPI/Swagger 文档生成异常:多数插件只认首个匹配路由,后续同路径的 POST/PUT 不会被收录
- 调试困难:
php bin/hyperf.php route:list输出中会出现两条重复路径,难以分辨哪条绑定了哪些中间件或条件 - 不符合 FastRoute 底层设计意图:FastRoute 的
addRoute原生支持 method 数组,Hyperf 封装层也明确保留了该能力,绕开它等于放弃语义清晰性
动态路由参数与多方法共存要注意正则边界
带变量的路由如 /user/{id:\d+} 在多方法绑定时,正则校验仍生效,但不同方法对同一参数的业务含义可能不同(比如 GET 查详情、DELETE 删记录),此时需确保正则足够宽松又不失控。
- 避免写
{id:[a-zA-Z0-9_\-]+}这类过于宽泛的正则,否则可能被恶意构造路径绕过权限检查 - 若 DELETE 接口要求
id必须为数字,而 PATCH 允许字符串 ID,那就不能共用一条多方法路由,必须拆成两条——路由设计要服从语义一致性,而不是技术便利性 - 使用
Router::addRoute时,路径字符串里不能含空格或换行,否则 FastRoute 解析失败,报错信息是Invalid route definition
真正需要多方法共存的场景不多,多数时候是 CRUD 接口分离更清晰。但如果确实要合并(比如 Webhook 入口统一接收各种事件),就老实用 addRoute 或 #[RequestMapping(method: [...])],别试图靠路由分组或中间件“模拟”方法切换——那只会把逻辑耦合得更紧,也更难测试。










