hyperf 路由分组通过 router::addgroup() 统一管理前缀、中间件和嵌套路由,支持前缀拼接、中间件继承、多层嵌套及完整控制器路径调用,提升可读性与维护性。

Hyperf 中的路由分组(Route Group)主要用于对具有相同前缀、中间件或命名空间的路由进行统一管理,提升代码可读性和维护性。它不是简单拼接路径,而是通过 addGroup 方法构建逻辑分组,并支持多层嵌套与中间件继承。
基础路由分组定义方式
使用 Router::addGroup() 方法创建分组,第一个参数为公共前缀,第二个参数为闭包,在其中注册子路由:
- 前缀会自动拼接到所有子路由的 URI 前面(如
/api+/users→/api/users) - 闭包内调用的
get、post等方法,等价于在全局 Router 上调用,只是 URI 自动加前缀 - 示例:
use Hyperf\HttpServer\Router\Router;
Router::addGroup('/api', function () {
Router::get('/users', 'App\Controller\UserController::index');
Router::post('/users', 'App\Controller\UserController::store');
});
中间件与分组绑定
可在分组时指定中间件,该中间件将自动应用到组内所有路由:
- 支持传入中间件类名数组,如
['AuthMiddleware', 'CorsMiddleware'] - 中间件执行顺序遵循数组顺序,且优先于控制器内定义的中间件
- 子分组可叠加新中间件,形成“中间件继承链”
Router::addGroup('/admin', ['App\Middleware\AuthMiddleware'], function () {
Router::get('/dashboard', 'App\Controller\Admin\DashboardController::index');
// 嵌套子分组,追加权限中间件
Router::addGroup('/users', ['App\Middleware\PermissionMiddleware'], function () {
Router::get('/', 'App\Controller\Admin\UserController::index');
Router::post('/', 'App\Controller\Admin\UserController::create');
});
});
命名空间与控制器自动解析
分组本身不强制绑定命名空间,但常配合 addNamespace() 或手动拼接完整类名使用:
- 推荐在分组闭包中统一使用完整控制器路径,避免歧义
- 若项目采用标准命名规范,也可在分组外提前设置默认命名空间(需自行封装逻辑或借助注解路由增强)
- 注意:Hyperf 默认路由不自动补全命名空间,
'UserController::index'会报错,必须写成'App\Controller\UserController::index'
嵌套分组与路径组合逻辑
Hyperf 允许无限层级嵌套分组,URI 是各层前缀按顺序拼接的结果:
- 外层
/v1+ 内层/order+ 子路由/list→ 最终匹配/v1/order/list - 嵌套时中间件是累加的,即外层中间件 + 内层中间件都会执行
- 不建议过度嵌套(如超过 3 层),否则路由调试和维护成本上升
Router::addGroup('/v1', function () {
Router::addGroup('/goods', function () {
Router::get('/list', 'App\Controller\GoodsController::list');
Router::get('/detail/{id}', 'App\Controller\GoodsController::detail');
});
});











