Hyperf原生支持GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS方法,TRACE和CONNECT虽可注册但默认被忽略;addRoute()中$httpMethod参数支持单字符串(如'GET')、字符串数组(如['GET','POST'])或全大写常量,大小写不敏感但禁止非法字符。

Hyperf 支持的 HTTP 请求方法有哪些
Hyperf 原生支持全部标准 HTTP 方法,底层由 Nikic/FastRoute 驱动,没有人为阉割或限制。你写 get、post、put、delete、patch、head、options 都可以直接用 —— 但注意:trace 和 connect 虽然语法上能注册,实际在 Hyperf 的 HTTP Server 层默认被忽略(不进路由分发),除非你自定义了协程服务器行为。
addRoute() 中传入的 $httpMethod 参数怎么写
Router::addRoute() 是最底层的注册方式,第一个参数就是请求方法,接受三种形式:
- 单个字符串:
'GET'、'post'(大小写不敏感) - 字符串数组:
['GET', 'POST']、['get', 'head', 'options'] - 全大写常量(不推荐):
HttpMethod::GET等需手动引入,无必要
常见错误是写成 'Get'(首字母大写其余小写)或带空格如 ' GET ',会导致匹配失败但无报错 —— 请求直接 404,因为 FastRoute 内部做了 strtoupper(trim()) 标准化,但你的拼写若含非法字符(比如中文顿号、全角括号),会静默跳过该路由规则。
快捷方法 get/post/put 等和 addRoute 有什么区别
它们只是语法糖,本质都调用 addRoute()。例如:
Router::get('/user', 'App\Controller\UserController::index');
// 等价于
Router::addRoute('GET', '/user', 'App\Controller\UserController::index');
但要注意两点:
-
Router::head()不会自动 fallback 到get回调;它单独注册,必须显式定义才能响应 HEAD 请求 - 没有
Router::options()快捷方法,要用addRoute('OPTIONS', ...)显式注册,否则预检请求(CORS preflight)会 405
为什么 OPTIONS 请求总是 405 或不触发中间件
因为 Hyperf 默认不自动处理 OPTIONS,即使你注册了 addRoute('OPTIONS', ...),如果没配中间件或没返回正确响应头(如 Access-Control-Allow-Methods),前端仍会卡住。更常见的做法是:在全局中间件里拦截 OPTIONS 并提前返回,而不是依赖路由回调 —— 尤其当你用 @AutoController 时,它根本不会为 OPTIONS 生成任何路由规则。
真正容易被忽略的是:FastRoute 在编译阶段会把 OPTIONS 当作独立 method 处理,它不参与 method fallback,也不受 Router::addGroup() 的隐式继承影响 —— 必须每一层都显式声明。



















