Sylius Unified API 版本化方案演进:从 /new-api 到 /api/v2 的 URL 前缀决策与落地实践 电商后端API网关【免费下载链接】SyliusHeadless open-source eCommerce platform on top of PHP/Symfony/API Platform项目地址https://gitcode.com/gh_mirrors/sy/Sylius点击查看免费下载本文围绕 Sylius 官方 ADR 文档 adr/2021_02_05_unified_api_prefix.md 展开梳理 Unified API 从临时前缀/new-api走向正式版本化路径/api/v2的完整决策过程并结合当前仓库中的路由、安全与测试源码还原该决策在 Symfony API Platform 架构下的真实落地方式。读完本文你将理解 Sylius 选择 URL 版本化而非Accept头/自定义头的技术动机掌握sylius.security.api_route系列参数如何驱动 API 路由挂载与安全防火墙并能在自己的 Sylius 项目中准确解释与定位/api/v2前缀的来龙去脉。决策背景/new-api前缀的先天不足在 Unified API统一 API的初期实现中Sylius 使用/new-api作为所有聚合端点的前缀。这一命名存在两个明显问题不携带版本信息new-api只表达“新旧”关系而“新”是相对概念无法为客户端提供稳定的契约承诺不具备面向未来的可扩展性正如 ADR 原文所言——At some moment of time our new api can become old api。当下一代 API 出现时/new-api这个前缀既无法区分自身版本也无法容纳后续版本。在当时的另一份 ADR adr/2020_09_01_admin_and_shop_split.md关于 Admin 与 Shop 路由拆分中可以清晰看到new-api时代的典型接口形态例如GET /new-api/products/knitted-wool-blend-green-cap # 面向访客按 slug 定位商品 GET /new-api/products/KNITTED_WOOL_BLEND_GREEN_CAP # 面向管理员按 code 定位商品这说明在 Unified API 起步阶段Sylius 团队尚未建立明确的 API 版本化指引。本 ADR 的目标正是补上这一空缺为 API 提供清晰、稳定、可持续演进的版本化规则。三种备选方案及其权衡针对“如何为 Unified API 表达版本”ADR 评估了三种主流方案并逐一列出优缺点。方案一URL 前缀版本化/api/v2将/new-api直接改为/api/v2优点沿用已有模式——旧版 Admin API 本就使用/api/v1前缀新方案与既有约定一脉相承优点API 的版本优先级一目了然/api/v1与/api/v2的边界在 URL 中直接可见优点开箱即用链接天然可访问无需客户端额外处理请求头。缺点客户端难以“渐进式迁移”——同一请求路径无法按资源粒度混用新旧版本缺点从 REST 理论视角看URL 中的版本号不应影响资源的表现形式representation版本属于内容协商层面的关注点。方案二Accept头携带 vendor 信息保留/api作为路径并要求客户端携带Accept: application/vnd.sylius.v1json请求头优点被视为 API 版本化的最佳实践之一优点Accept头本就是 HTTP 内容协商content negotiation的专用机制语义上名正言顺。缺点打破了既有模式——旧 Admin API 的/api/v1约定将被弃用缺点在裸请求RAW form如 curl 手写请求、浏览器地址栏直开下执行成本更高不利于快速验证与调试。方案三自定义请求头X-Sylius-API-Version保留/api路径要求客户端携带X-Sylius-API-Version: 1自定义头缺点相比Accept头方案没有任何实质性收益且自定义头偏离 HTTP 标准语义因此该选项在评估中直接被否。当时的行业背景ADR 记录了一个重要时代背景在文档撰写时2021 年 2 月API Platform 官方对“如何解决 API 版本化”尚无明确答案社区推荐做法不一——从使用序列化组serialization groups控制不同版本的输出表现到干脆为不同版本创建独立应用众说纷纭。这也是 Sylius 团队需要自行拍板的原因原文档 References 部分列出当时参考的 API Platform 社区 issue/PR 与业界讨论可查阅原 ADR 获取完整清单。决策结果采用/api/v2端点路径ADR 最终裁定采用/api/v2作为 Unified API 的端点路径核心依据有两点底层技术、结构与内容已发生显著变化——Unified API 相比旧的/api/v1Admin API 是一次实质性重构值得用新的主版本号加以区分方案一的易用性easiness明显占优——URL 前缀对开发者最友好迁移与调试成本最低。同时ADR 明确保留了未来演进空间不排除在/api/v2路径之外再叠加Accept头但也提醒这可能会对 API 消费者造成误导同一路径 双版本信号容易产生歧义。仓库中的真实落地从参数到路由再到安全防火墙决策并不止步于文档/api/v2在当前仓库中已经成为一套由参数驱动的完整机制。其源头是 src/Sylius/Bundle/ApiBundle/Resources/config/app/config.yaml 中定义的一组参数sylius.security.api_route: /api/v2 sylius.security.api_regex: ^%sylius.security.api_route% sylius.security.api_admin_route: %sylius.security.api_route%/admin sylius.security.api_admin_regex: ^%sylius.security.api_admin_route% sylius.security.api_shop_route: %sylius.security.api_route%/shop sylius.security.api_shop_regex: ^%sylius.security.api_shop_route% sylius.security.api_shop_account_route: %sylius.security.api_shop_route%/account sylius.security.api_shop_account_regex: ^%sylius.security.api_shop_account_route%参数默认值用途sylius.security.api_route/api/v2Unified API 全局前缀即本 ADR 的最终决策点sylius.security.api_regex^/api/v2匹配整个 API 域的正则sylius.security.api_admin_route/api/v2/adminAdmin 侧 API 前缀与 admin_and_shop_split ADR 的拆分决策衔接sylius.security.api_admin_regex^/api/v2/adminAdmin API 防火墙/访问控制匹配正则sylius.security.api_shop_route/api/v2/shopShop 侧 API 前缀sylius.security.api_shop_regex^/api/v2/shopShop API 防火墙/访问控制匹配正则sylius.security.api_shop_account_route/api/v2/shop/accountShop 侧“我的账户”类受限资源前缀路由挂载前缀如何生效根配置 config/routes/sylius_api.yaml 将 ApiBundle 内部路由整体挂载到该参数指定的前缀之下sylius_api: resource: SyliusApiBundle/Resources/config/routing.yml prefix: %sylius.security.api_route%而 src/Sylius/Bundle/ApiBundle/Resources/config/routing.yml 内部再以/为基准前缀定义具体端点sylius_api: resource: . type: api_platform prefix: / sylius_api_admin_authentication_token: path: /admin/administrators/token methods: [POST] sylius_api_admin_statistics: path: /admin/statistics methods: [GET] defaults: _controller: sylius_api.controller.get_statistics sylius_api_shop_authentication_token: path: /shop/customers/token methods: [POST]两层前缀叠加后最终对外暴露的端点即为/api/v2/admin/...与/api/v2/shop/...——这正是“URL 前缀版本化”在 Symfony 路由层面的标准落地方式。安全防火墙版本前缀与认证体系绑定config/packages/security.yaml 中/api/v2派生出的正则被用于划分两套无状态statelessJWT 防火墙api_admin: pattern: %sylius.security.api_admin_regex%/.* stateless: true entry_point: jwt json_login: check_path: %sylius.security.api_admin_route%/administrators/token username_path: email password_path: password api_shop: pattern: %sylius.security.api_shop_regex%/.* stateless: true entry_point: jwt json_login: check_path: %sylius.security.api_shop_route%/customers/token username_path: email password_path: password即管理员登录端点为POST /api/v2/admin/administrators/token商城用户登录端点为POST /api/v2/shop/customers/token。配套的access_control规则同样基于这些前缀展开例如api_admin全域要求ROLE_API_ACCESS而sylius.security.api_shop_account_regex%/.*即/api/v2/shop/account/...要求ROLE_USERcustomers/token等端点则开放为PUBLIC_ACCESS。可以看到一个/api/v2参数同时串联起了路由、认证、授权三层配置。测试证据前缀已成为事实契约当前仓库的 API 集成测试全面使用/api/v2前缀例如 tests/Api/Admin/AdminUsersTest.php 中的GET /api/v2/admin/administrators、POST /api/v2/admin/administrators以及 tests/Api/Shop/AddressesTest.php 中的GET /api/v2/shop/addresses等。测试是版本化决策最直接的“行为契约”任何破坏/api/v2前缀的改动都会在这些用例中暴露。方案边界与后续演进与 Admin/Shop 拆分决策的衔接本 ADR 的/api/v2前缀并非孤立决定它与 adr/2020_09_01_admin_and_shop_split.md 中“Admin 与 Shop 资源分离”的决策共同塑造了今天的 API 形态版本号/api/v2与上下文/admin、/shop在 URL 中分层表达前者回答“契约版本”后者回答“访问上下文”。与 IRI 标识决策的衔接Sylius 后续关于“请求中用 IRI 而非 code/id 作为资源标识”的决策见 adr/2021_04_15_using_iri_as_api_resource_identifier_in_request_instead_of_code_id.md同样建立在稳定的 URL 前缀之上——/api/v2/admin/...、/api/v2/shop/...为每个资源提供了确定、可预期的 IRI 基座。未来的Accept头选项按 ADR 结论Sylius 保留了未来叠加Accept头如application/vnd.sylius.v1json的技术可能性但明确指出“可能对消费者产生误导”。对于 API 客户端这意味着当前与未来的稳定契约都应以/api/v2前缀为准版本信号只出现在 URL 中无需也不应依赖自定义头。结语/api/v2前缀决策是 Sylius Unified API 演进史中的关键节点它用一个简单、符合既有习惯的 URL 约定替代了语义模糊的/new-api并把“版本化”这一跨 REST 理论、API Platform 生态与工程易用性的复杂问题收敛为一个可执行、可测试、可运维的明确契约。从本仓库的配置与测试可以确认这一决策已完整渗透到路由挂载、安全防火墙与集成测试之中成为 Sylius Headless API 的稳定底座。赞分享电商后端API网关【免费下载链接】SyliusHeadless open-source eCommerce platform on top of PHP/Symfony/API Platform项目地址https://gitcode.com/gh_mirrors/sy/Sylius点击查看免费下载相关推荐Sylius 管理端与商店端 API 路由分离从 ADR 决策到 /api/v2/admin 与 /api/v2/shop 的落地实现Sylius 管理端与商店端 API 路由分离从 ADR 决策到 /api/v2/admin 与 /api/v2/shop 的落地实现 导读 本文以 Syli电商后端API网关Sylius API 可翻译实体译文设计从 ADR 内嵌决策到 API Platform 落地实现Sylius API 可翻译实体译文设计从 ADR 内嵌决策到 API Platform 落地实现 本文以 Sylius 仓库中的架构决策记录ADR ad电商后端API网关Dillinger API 版本化实战指南从版本化策略选择到 /api/v1 落地实现Dillinger API 版本化实战指南从版本化策略选择到 /api/v1 落地实现 本文以 Dillinger 仓库中的 API 版本化策略文档为核心系前端开发工具上一篇Screenshot-to-code测试自动化最佳实践从单元测试到E2E测试下一篇AI Commits测试覆盖率分析如何评估AI代码提交工具的质量完整性创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考