API Platform 2.6版本如何实现API版本控制?接口破坏性变更适配问询
API Platform 2.6 路径版本控制实现方案
API Platform 2.6 没有内置路径维度的版本控制能力,可通过以下两种主流方案实现需求,可根据版本差异大小选择:
方案1:路径前缀+序列化/校验组隔离(适合字段级差异的轻量变更场景)
该方案无需拆分核心逻辑,仅通过规则隔离实现版本差异,完全满足「同一字段v1非必填、v2必填」的需求,实现步骤如下:
- 第一步:配置双版本路由前缀
在config/routes/api_platform.yaml中添加多版本路由规则,同时注册一个内核请求事件监听器,从请求路径中提取版本号存入请求属性,示例监听器逻辑:
记得在服务配置里给这个监听器打上// src/EventListener/ApiVersionListener.php public function onKernelRequest(RequestEvent $event) { $request = $event->getRequest(); if (!str_starts_with($request->getPathInfo(), '/api/')) return; preg_match('#^/api/(v\d+)/#', $request->getPathInfo(), $matches); $version = $matches[1] ?? 'v1'; $request->attributes->set('api_version', $version); }kernel.event_listener标签,监听kernel.request事件。 - 第二步:通过校验组实现字段必填性差异
在实体类的字段注解中,给不同版本的校验规则指定对应校验组:// src/Entity/User.php /** * @Assert\NotBlank(groups={"v2"}) // 仅v2版本触发非空校验 * @Groups({"v1:read", "v1:write", "v2:read", "v2:write"}) */ private $name; - 第三步:动态绑定序列化/校验组
自定义序列化组解析器和校验组解析器,根据请求中存储的api_version动态加载对应版本的组:
示例校验组配置:
解析器逻辑里返回对应版本的校验组即可,比如v2版本返回# config/packages/api_platform.yaml api_platform: validation: validation_groups_resolver: App\Resolver\ValidationGroupResolver['Default', 'v2'],v1版本返回['Default']。
方案2:实体类拆分(适合版本差异极大的场景)
如果两个版本逻辑差异超过30%,共用实体会导致代码冗余混乱,可直接拆分不同版本的实体类:
- 分别创建
App\Entity\V1和App\Entity\V2两个命名空间,存放对应版本的资源实体 - 每个实体单独配置
@ApiResource注解,直接指定路径前缀:
该方案两个版本完全隔离,不会出现规则互相干扰的问题,后期迭代维护成本更低。// V1版本实体 /** * @ApiResource( * path="/api/v1/users", * normalizationContext={"groups"={"v1:read"}}, * denormalizationContext={"groups"={"v1:write"}} * ) */ class User {} // V2版本实体 /** * @ApiResource( * path="/api/v2/users", * normalizationContext={"groups"={"v2:read"}}, * denormalizationContext={"groups"={"v2:write"}} * ) */ class User { /** * @Assert\NotBlank() * @Groups({"v2:read", "v2:write"}) */ private $name; }
内容的提问来源于stack exchange,提问作者Rassoul
相关产品推荐
相关产品推荐

