router::get基本写法是在config/routes.php中注册get路由,参数为路径字符串(支持{param}占位符及d+等正则约束)和可调用类型(如[类名, 方法名]或闭包),不支持字符串类方法格式;与注解路由共存时以routes.php优先,404常见原因为路径不匹配、文件未加载或尾部斜杠不一致。

Hyperf 中 Router::get 的基本写法
直接用 Router::get 注册 GET 路由,必须在 config/routes.php 文件中,且需确保该文件被框架自动加载(默认已配置)。不能在控制器、中间件或任意 PHP 文件里零散调用 —— 否则路由不会生效。
最简形式:
use HyperfHttpServerRouterRouter;
Router::get('/users', [AppControllerUserController::class, 'index']);
- 第一个参数是路径字符串,支持参数占位,如
/users/{id} - 第二个参数是可调用类型:数组
[类名, 方法名]、闭包、或callable实例 - 不支持直接传字符串类方法(如
'App\Controller\UserController@index'),会报Target class does not exist
带参数的 Router::get 怎么写才不丢值
路径中用 {param} 定义变量,但默认不自动绑定类型或验证。若想让 {id} 只接受数字,得手动加正则约束,否则 /users/abc 也会命中并传入字符串 'abc',容易在控制器里触发类型错误或 SQL 报错。
带约束的写法:
Router::get('/users/{id:d+}', [AppControllerUserController::class, 'show']);
-
d+是 PCRE 正则,表示「一个或多个数字」;注意反斜杠要双写(PHP 字符串中) - 多个参数可叠加:
/posts/{year:d{4}}/{month:d{2}} - 约束不满足时,路由完全不匹配,交由下一个路由或返回 404,不会进控制器再抛异常
Router::get 和注解路由冲突怎么办
如果同时用了 @GetMapping 注解和 Router::get 注册同一路由,Hyperf 会以「先定义者为准」—— 通常是 routes.php 优先级更高,注解可能被覆盖。更麻烦的是,开发时改了注解却没生效,以为是缓存问题,其实是被硬编码路由截胡了。
- 检查
config/autoload/annotations.php是否启用注解扫描('scan' => ['paths' => [...]]) - 确认没有在
routes.php里重复注册相同路径 - 临时调试可加
var_dump(Router::getRoutes())查看最终注册表(需在routes.php末尾或启动后早期位置)
为什么 Router::get 写了但请求 404
最常见原因是路由没加载,或者路径拼写/大小写/斜杠数量不对。Hyperf 默认不自动添加尾部斜杠重定向,/users 和 /users/ 是两个不同路由。
- 检查
config/autoload/server.php中'http' => [...]是否启用了Router组件(默认开启,但自定义 server 配置可能删掉) - 确认
config/routes.php文件存在且返回数组(即使为空也要return [];) - CLI 启动后看日志是否有
Route registered: GET /xxx类似输出;没有说明文件未执行 - 使用
php bin/hyperf.php route:list命令查看实际加载的路由表(注意:该命令依赖hyperf/rate-limiter等组件,若未安装会报错,此时改用日志或var_dump更可靠)
Router::get,再逐步加约束或组合逻辑。











