当前位置: 首页 > news >正文

Hyperf方案 API版本管理

<?php/** * 案例053:API版本管理 * 说明:路由前缀v1/v2实现版本隔离,新旧版本并存,平滑升级 * 需要安装的包:hyperf/http-server */declare(strict_types=1);namespaceApp\Controller;useHyperf\HttpServer\Annotation\Controller;useHyperf\HttpServer\Annotation\GetMapping;useHyperf\HttpServer\Annotation\Middleware;useHyperf\HttpServer\Contract\RequestInterface;/** * 版本管理策略: * 方案一(推荐):URL路径版本号 /api/v1/users、/api/v2/users * 方案二:请求头版本号 Accept: application/vnd.api+json;version=2 * 方案三:查询参数 /api/users?version=2 * * 这里用方案一,最直观,对缓存也友好 */// ========== V1版本(旧版本,继续维护中) ==========/** * V1用户接口 * 特点:返回字段少,格式简单 */#[Controller(prefix:'/api/v1/users')]classUserV1Controller{publicfunction__construct(privateRequestInterface$request){}/** * GET /api/v1/users/{id} * V1返回格式:字段少,直接返回data */#[GetMapping(path:'{id:\d+}')]publicfunctionshow(int$id):array{$user=\Hyperf\DbConnection\Db::table('users')->find($id);if(!$user){return['code'=>404,'message'=>'用户不存在'];}// V1只返回基础字段return['code'=>0,'data'=>['id'=>$user->id,'name'=>$user->name,// V1用name字段],];}#[GetMapping(path:'')]publicfunctionindex():array{$users=\Hyperf\DbConnection\Db::table('users')->select(['id','name'])// V1只返回id和name->paginate(20);return['code'=>0,'data'=>$users];}}// ========== V2版本(新版本) ==========/** * V2用户接口 * 特点:字段更丰富,格式有变化,比如name改成了nickname */#[Controller(prefix:'/api/v2/users')]classUserV2Controller{publicfunction__construct(privateRequestInterface$request){}/** * GET /api/v2/users/{id} * V2返回格式变化: * 1. name字段改名为nickname * 2. 新增avatar、created_at字段 * 3. 分页信息更丰富 */#[GetMapping(path:'{id:\d+}')]publicfunctionshow(int$id):array{$user=\Hyperf\DbConnection\Db::table('users')->find($id);if(!$user){return['code'=>404,'message'=>'用户不存在','data'=>null];}return['code'=>0,'message'=>'success','data'=>['id'=>$user->id,'nickname'=>$user->name,// V2改名了'avatar'=>$user->avatar??'',// V2新增字段'email'=>$user->email,// V2新增字段'created_at'=>$user->created_at,],];}#[GetMapping(path:'')]publicfunctionindex():array{$page=(int)$this->request->query('page',1);$size=(int)$this->request->query('size',20);$total=\Hyperf\DbConnection\Db::table('users')->count();$users=\Hyperf\DbConnection\Db::table('users')->select(['id','name as nickname','avatar','email'])// V2字段->forPage($page,$size)->get();return['code'=>0,'data'=>$users,'meta'=>['total'=>$total,'page'=>$page,'size'=>$size],// V2有meta];}}/** * 版本路由器:根据请求头里的Accept版本号自动路由到对应版本 * 同时支持URL路径版本和请求头版本两种方式 */classApiVersionMiddlewareimplements\Psr\Http\Server\MiddlewareInterface{publicfunctionprocess(\Psr\Http\Message\ServerRequestInterface$request,\Psr\Http\Server\RequestHandlerInterface$handler):\Psr\Http\Message\ResponseInterface{// 从Accept头解析版本号,如 Accept: application/json; version=2$accept=$request->getHeaderLine('Accept');$version='v1';// 默认版本if(preg_match('/version[=\/](\d+)/i',$accept,$m)){$version='v'.$m[1];}// URL路径里有明确版本号就用URL的,优先级更高$path=$request->getUri()->getPath();if(preg_match('#/api/(v\d+)/#',$path,$m)){$version=$m[1];}// 存到协程上下文,Controller里可以读到\Hyperf\Context\Context::set('api_version',$version);return$handler->handle($request);}}/** * 版本兼容性处理:用装饰器模式,V2继承V1复用代码,只重写变更的方法 */classUserV3ControllerextendsUserV2Controller{/** * V3只改了详情接口,列表接口复用V2的 */#[GetMapping(path:'{id:\d+}')]publicfunctionshow(int$id):array{$v2Result=parent::show($id);if($v2Result['code']!==0)return$v2Result;// V3在V2基础上增加更多字段$v2Result['data']['extra_field']='v3新字段';return$v2Result;}}
http://www.jsqmd.com/news/620299/

相关文章:

  • 实战指南:30分钟构建你的智能多目标跟踪系统
  • 【openclaw实用Skill】oracle 技能
  • 最终版本步骤
  • 六位数码管显示
  • Hyperf方案 API网关统一鉴权
  • 时序数据库选型指南:InfluxDB与TDengine的性能对比与实战安装
  • 高性能无人机飞控系统源码:基于Cesium+Vue3+Vite的三维可视化平台
  • 技术视角:Behdad字体 - 波斯语开源字体的现代化设计与工程实践
  • geoserver修改密码
  • 豆包Trace Ide使用技巧汇总
  • ios开发方向——swift并发进阶核心 @MainActor 与 DispatchQueue.main 解析
  • Hyperf方案 API限流熔断
  • 告别黑壳子DAP!用AT32F403A和CherryUSB自制高速DAPLink V2仿真器(附完整源码)
  • E2E_P01Check 函数笔记
  • 终极宝可梦随机化器ZX:重新定义七代游戏的个性化冒险体验
  • 一条命令搞定OpenClaw部署?PPClaw的便利背后,你得先看清这些代价
  • python学习笔记2
  • OpenClaw 横向评测|对比 AutoGPT、CoPaw、NanoClaw 等主流 AI Agent,谁更适合你?
  • Keyviz:终极免费工具!实时可视化你的键盘鼠标操作,让教学录制更轻松
  • Hyperf方案 API签名验证
  • 第15届省赛蓝桥杯大赛C/C++大学B组
  • C++跨平台性能监控实战:构建CPU、GPU、磁盘与网络一体化探针
  • nav标签适用场景是什么_导航栏语义化写法【方法】
  • 部署成本降60%,响应提速10倍:镜像视界AI视频孪生的工程化价值
  • mysql事务隔离级别切换注意事项_如何保证系统平滑过渡
  • 【传统图像分割算法】- 图像分割之自适应阈值(Adaptive Thresholding)完全解析
  • 嵌入式Linux实战:手把手教你为EC20 4G模块编译GobiNet驱动(附完整Makefile配置)
  • HY-Motion 1.0开源大模型部署教程:支持企业级3D数字人动作生成生产环境
  • 2279 上市公司跨国供应链【存续力】(Sustainability) 指标(2004.07-2026.02)
  • C++ vs .NET 数组原地反转实测:小数组 C++ 碾压,大数组 .NET 反杀?好