ReDoc UI broken out of the box: OpenAPI version hard-coded to 3.2.0, downgrade mechanism doesn't cover 3.1 or the HTML-embedded spec
还没有人认领这个 Issue。
评估
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 新手友好度
- 65/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 活跃
- 技术栈
- php, symfony
调研方向
The issue is in the OpenApi class and SwaggerUiProcessor. Start by examining api-platform/openapi/OpenApi.php to see the hard-coded version. Then look at LegacyOpenApiNormalizer to understand the downgrade mechanism and SwaggerUiProcessor::process() to see how the spec is embedded. The goal is to allow a spec_version context to flow through and add support for OpenAPI 3.1.0. Test by enabling ReDoc and checking the /docs.html?ui=re_doc endpoint.
由索引模型根据 Issue 内容生成。
描述
Description
Since #8350, ApiPlatform\OpenApi\OpenApi hard-codes the generated document's openapi field to 3.2.0, with no way to override it:
// api-platform/openapi/OpenApi.php
public const VERSION = '3.2.0';
private string $openapi = self::VERSION;
$openapi has no constructor parameter and no setter (getOpenapi() is the only accessor), so every generated document is unconditionally tagged 3.2.0.
ReDoc 2.x (the version currently bundled in api-platform/symfony, 2.5.2) does not support OpenAPI 3.2 and rejects the document outright with Unsupported OpenAPI version: 3.2.0 (see Redocly/redoc#2773, #2746 — ReDoc 2.x only supports 3.1/3.0/Swagger 2.0; 3.2 support is planned for the upcoming Redoc 3 engine). So /docs.html?ui=re_doc is broken out of the box on a fresh install with ReDoc enabled, whenever Swagger UI's default format negotiation resolves to 3.2.0 (i.e. always, since there's no way to change it).
There is a downgrade mechanism (spec_version context key, read from the ?spec_version= query param in DocumentationAction::__invoke()), but it has two gaps that make it useless for this case:
- Only
3.0.0is implemented.LegacyOpenApiNormalizer::normalize()hard-codes the check to'3.0.0' !== ($context['spec_version'] ?? null)— there's no3.1.0branch, even though ReDoc 2.x does support 3.1. A user hitting this can only downgrade all the way to 3.0 (losing 3.1/3.2 features), not to the version their tool actually supports. - It never reaches the HTML-embedded UIs.
SwaggerUiProcessor::process()builds the spec embedded into the ReDoc/Swagger UI/Scalar page with a hard-coded empty context:'spec' => $this->normalizer->normalize($openApi, 'json', []),$context(which would carryspec_versionfrom the request) is available as a method parameter but is never passed through here.init-redoc-ui.jsthen doesRedoc.init(data.spec, {}, ...)against that same embedded object — it never performs a separate fetch, so there's no way for?spec_version=on the page URL to have any effect on what ReDoc actually renders, even for the one version (3.0.0) the mechanism does support.
Steps to reproduce
- Fresh API Platform (Symfony) install,
enableReDoc: true. - Visit
/docs.html?ui=re_doc(or/docs?ui=re_doc). - ReDoc fails with "Unsupported OpenAPI version: 3.2.0" — Swagger UI and Scalar on the same install render fine, since both understand 3.2.
Possible fix
- Add a
3.1.0branch toLegacyOpenApiNormalizer(or generalize it to accept any target version it knows how to downgrade to), so installs with ReDoc 2.x enabled aren't forced all the way down to 3.0. - Thread
$context(or at leastspec_version) throughSwaggerUiProcessor::process()'s$this->normalizer->normalize($openApi, 'json', [])call, so the embedded HTML spec actually reflects the query param / a config default — not just the raw/docs.{_format}JSON/YAML endpoints. - Alternatively, since ReDoc's own incompatibility is the root trigger (Redocly/redoc#2773), consider defaulting
enableReDocoff when the generated document targets an OpenAPI version ReDoc is known not to support, or documenting that ReDoc + the new 3.2 default are currently incompatible out of the box.
Environment
api-platform/core(openapi + symfony packages): v4.4.0- Bundled ReDoc: 2.5.2 (
vendor/api-platform/symfony/Bundle/Resources/public/redoc/redoc.standalone.js)
- 主要语言
- PHP
- 星标
- 2.6k
- 派生
- 982
- 平均合并
- 1 天 16 小时
- 30 天内合并 PR
- 59
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
api-platform/core 的其他 Issue
-
难度 1/5 1 小时以内 新手友好度 85/100
api-platform/core#8573 ·
-
难度 2/5 1-3 小时 新手友好度 70/100
api-platform/core#8571 ·
-
难度 2/5 1-3 小时 新手友好度 65/100
api-platform/core#8564 ·
-
难度 2/5 1-3 小时 新手友好度 84/100
api-platform/core#8495 ·
-
难度 2/5 1-3 小时 新手友好度 85/100
api-platform/core#8471 ·
查看 api-platform/core 的全部 Issue
相似的 Issue
-
tooling
难度 2/5 1-3 小时 新手友好度 75/100
-
UX
难度 2/5 1-3 小时 新手友好度 70/100
ProfessionalWiki/NeoWiki#1525 ·
-
难度 2/5 1-3 小时 新手友好度 75/100
-
难度 1/5 1 小时以内 新手友好度 90/100
OpenConext/OpenConext-engineblock#2122 ·
-
Bug
难度 2/5 1-3 小时 新手友好度 70/100
Automattic/safe-publish#594 ·