Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

JSON:API: `included` schema is `items: {anyOf: []}` when a relation points to a resource without operations (`NotExposed`)

未关闭
#8,700 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
3/5
预计耗时
半天
新手友好度
65/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
php, symfony
领域
api

调研方向

The empty anyOf comes from JsonApi\JsonSchema\SchemaFactory::buildDefinitionPropertiesSchema(), which skips related classes with false === $hasOperations but still writes anyOf when no reference remains. Reproduce with the two resources in the issue and run bin/console api:openapi:export to inspect Book.jsonapi. Done when included.items is a valid schema (for example {"type": "object"}) or has no empty anyOf, and the exported spec passes validation.

由索引模型根据 Issue 内容生成。

描述

API Platform version(s) affected

4.4.4

Description

A resource has a relation to another resource whose only operation is NotExposed. The included property of the JSON:API document schema is then:

"included": { "type": "array", "items": { "anyOf": [] } }

JSON Schema requires anyOf to be a non-empty array, so the document is invalid. Spectral (oas3-schema) and code generators reject it.

The cause looks like JsonApi\JsonSchema\SchemaFactory::buildDefinitionPropertiesSchema(). It skips a related class when false === $hasOperations, but it still writes anyOf when no reference remains.

How to reproduce
#[ApiResource(operations: [new NotExposed()])]
final class Author
{
    public function __construct(public int $id = 1, public string $name = 'Frank Herbert') {}
}

#[ApiResource(operations: [new Get(provider: [self::class, 'provide'])])]
final class Book
{
    public function __construct(public int $id = 1, public string $title = 'Dune', public Author $author = new Author()) {}
    public static function provide(): self { return new self(); }
}

The Book.jsonapi schema:

"included": {
  "description": "Related resources requested via the \"include\" query parameter.",
  "type": "array",
  "items": { "anyOf": [] },
  "readOnly": true
}

Expected: when no related class has a schema reference, included.items is {"type": "object"}, or the anyOf key is left out.

Additional Context

Checked on api-platform/core v4.4.4, Symfony 7.4, PHP 8.5, in an empty Symfony app. The code of JsonApi\JsonSchema\SchemaFactory on main is the same as in v4.4.4.

The app has only FrameworkBundle, TwigBundle and ApiPlatformBundle, with this config:

$c->extension('api_platform', [
    'mapping' => ['paths' => ['%kernel.project_dir%/src/ApiResource']],
    'formats' => ['jsonapi' => ['application/vnd.api+json']],
    'docs_formats' => ['jsonopenapi' => ['application/vnd.openapi+json']],
    'doctrine' => ['enabled' => false],
]);

The spec comes from bin/console api:openapi:export.

主要语言
PHP
星标
2.6k
派生
989
平均合并
1 天 23 小时
30 天内合并 PR
102

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

api-platform/core 的其他 Issue

查看 api-platform/core 的全部 Issue

相似的 Issue

更多 PHP Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。