hyperf 3.1 路由分组正确写法为 router::addgroup('/prefix', function () { ... }, ['middleware' => [...]]),前缀必须以/开头,闭包内子路由自动继承前缀但不继承中间件,需显式配置。

路由分组的正确写法
Hyperf 3.1 的路由分组不是简单拼接前缀,而是通过 Router::addGroup() 显式声明作用域。它接受三个参数:前缀路径(必须以 / 开头)、闭包回调、可选配置数组。
- 前缀必须带开头斜杠,例如
'/api',写成'api'会导致路由匹配失败 - 闭包内定义的子路由会自动继承前缀,但不会自动继承中间件,需显式传入
middleware键 - 支持嵌套分组,但建议单层为主,避免路径逻辑混乱
- 示例:
Router::addGroup('/v2', function () {<br> Router::get('/users', [\App\Controller\UserController::class, 'list']);<br> Router::post('/users', [\App\Controller\UserController::class, 'create']);<br> }, ['middleware' => [AuthMiddleware::class]]);
全局跨域中间件的配置位置
跨域中间件要生效为“全局”,必须注册在 config/autoload/middlewares.php 中,且与 server 名称严格对应。Hyperf 按 server 分组管理中间件,HTTP 服务默认名为 http。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 文件返回数组结构,
'http'键下填写中间件类全名组成的索引数组 - 顺序即执行顺序,跨域中间件建议放在最外层(数组首位),确保早于鉴权、日志等中间件执行
- 无需手动在每个路由里重复添加,也不用在控制器或注解中声明
- 正确配置示例:
return [<br> 'http' => [<br> App\Middleware\CorsMiddleware::class,<br> App\Middleware\AuthMiddleware::class,<br> ],<br> ];
CorsMiddleware 实现要点
自定义跨域中间件必须实现 MiddlewareInterface,并在 process() 方法中操作响应头。注意协程安全和 OPTIONS 预检处理。
- 必须调用
$handler->handle($request)获取下游响应,不能直接 new Response - 对
OPTIONS请求,需返回空响应并带上跨域头,否则浏览器预检失败 - 推荐设置
Access-Control-Allow-Credentials: true时,Access-Control-Allow-Origin不能为*,应指定具体域名 - 关键代码片段:
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface<br> {<br> $response = $handler->handle($request);<br> if ($request->getMethod() === 'OPTIONS') {<br> return $response<br> ->withHeader('Access-Control-Allow-Origin', 'https://your-domain.com')<br> ->withHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE,OPTIONS')<br> ->withHeader('Access-Control-Allow-Headers', 'Content-Type,Authorization')<br> ->withHeader('Access-Control-Allow-Credentials', 'true');<br> }<br> return $response<br> ->withHeader('Access-Control-Allow-Origin', 'https://your-domain.com')<br> ->withHeader('Access-Control-Allow-Credentials', 'true');<br> }
验证是否生效的快捷方式
不依赖前端调试,用 curl 直接测响应头最可靠:
- 检查全局中间件是否加载:
curl -I http://127.0.0.1:9501/any-path,看响应头是否含Access-Control-Allow-Origin - 模拟预检请求:
curl -I -X OPTIONS -H "Origin: https://test.com" http://127.0.0.1:9501/api/users - 确认 server 配置无误:检查
config/autoload/server.php中'name' => 'http'是否存在且未被覆盖 - 若仍无效,临时在中间件中加
var_dump('cors run');确认是否进入,排除注册遗漏










