Router::post是Hyperf中注册POST路由的核心方法,需传入路径和回调(支持字符串类方法、@语法或数组形式),推荐统一使用数组形式;不支持路径参数,须改用addRoute或注解;中间件需通过middleware选项显式传入,否则静默失效。

Router::post 是 Hyperf 中最常用的路由注册方式之一,直接对应 HTTP POST 请求,写法简单但参数细节容易出错。用错会导致 404、方法不被识别,甚至回调收不到数据。
基本写法与三种合法回调格式
必须传入两个参数:路径字符串和处理回调。回调支持三种写法,效果完全一致,选一种保持项目统一即可:
Router::post('/callback', 'App\Controller\WechatCallbackController::handle');Router::post('/callback', 'App\Controller\WechatCallbackController@handle');Router::post('/callback', [App\Controller\WechatCallbackController::class, 'handle']);
注意:App\Controller\WechatCallbackController::handle 中的双冒号是静态调用语法,@ 是传统 PHP 类方法调用符号,数组形式最明确、IDE 支持最好,推荐新项目统一用第三种。
带中间件的写法
企业微信回调这类敏感接口,通常需要校验签名、限流或日志记录,中间件必须在路由定义时显式传入 middleware 选项:
<pre class="brush:php;toolbar:false;">use App\Middleware\WechatSignatureMiddleware;
Router::post('/wechat/callback', [
App\Controller\WechatCallbackController::class,
'handle'
], [
'middleware' => [WechatSignatureMiddleware::class]
]);
漏掉 middleware 键名、或把中间件类名写成字符串(如 <code>'WechatSignatureMiddleware')都会导致中间件不生效;Swoole 下中间件不执行也不会报错,只会静默跳过,极难排查。
路径参数与正则约束怎么加
Router::post 本身不支持路径参数解析,要带变量必须用 Router::addRoute 或注解。但你可以手动加正则约束防止恶意路径:
- 错误写法(会被忽略):
Router::post('/callback/{id:\d+}', ...) - 正确写法(用
addRoute):Router::addRoute('POST', '/callback/{id:\d+}', [...]); - 更推荐写法(注解):
#[PostMapping('/callback/{id:\d+}')]放在控制器方法上
硬套 {id:\d+} 在 Router::post 第一个参数里,启动服务时不会报错,但实际请求匹配失败——这是 Hyperf 路由解析器的底层限制,不是配置问题。
为什么 POST 路由收不到企业微信回调
常见原因不是路由写错,而是:
- 服务器反向代理(Nginx)没透传
QUERY_STRING,导致msg_signature、timestamp等参数为空 - Hyperf 启动时没加载
httpserver 配置,servers配置里删掉了http项 - 路由文件
config/routes.php没被自动加载(检查config/autoload/server.php中是否包含该文件) - 回调地址填的是
http://但企业微信强制要求https://,连接直接被拒绝
真正卡住的地方往往不在 Router::post 这一行代码本身,而在它背后整个请求链路的连通性。先确认 curl -X POST http://localhost:9501/wechat/callback 能打进去,再查业务逻辑。


















