From 846152b970451ed44f9f0ff0ce5a2a1bf379c089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Leherpeur?= Date: Thu, 29 Jan 2026 22:11:16 +0100 Subject: [PATCH] fix Hydra JsonSchema SchemaFactory --- src/Hydra/JsonSchema/SchemaFactory.php | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/Hydra/JsonSchema/SchemaFactory.php b/src/Hydra/JsonSchema/SchemaFactory.php index 0a315096bd..b966632f84 100644 --- a/src/Hydra/JsonSchema/SchemaFactory.php +++ b/src/Hydra/JsonSchema/SchemaFactory.php @@ -81,11 +81,6 @@ final class SchemaFactory implements SchemaFactoryInterface, SchemaFactoryAwareI 'required' => ['@type'], ]; - /** - * @var array - */ - private array $transformed = []; - /** * @param array $defaultContext */ @@ -284,7 +279,7 @@ public function setSchemaFactory(SchemaFactoryInterface $schemaFactory): void private function decorateItemDefinition(string $definitionName, \ArrayObject $definitions, string $prefix, string $type, ?array $serializerContext): void { - if (!isset($definitions[$definitionName]) || ($this->transformed[$definitionName] ?? false)) { + if (!isset($definitions[$definitionName])) { return; } @@ -294,6 +289,12 @@ private function decorateItemDefinition(string $definitionName, \ArrayObject $de $baseName = self::ITEM_WITHOUT_ID_BASE_SCHEMA_NAME; } + // Check if the definition is already decorated to prevent double wrapping (recursion or cache) + $currentDef = $definitions[$definitionName]; + if (($currentDef['allOf'][0]['$ref'] ?? null) === $prefix.$baseName) { + return; + } + if (!isset($definitions[$baseName])) { $definitions[$baseName] = $hasNoId ? self::ITEM_BASE_SCHEMA_WITHOUT_ID : self::ITEM_BASE_SCHEMA_WITH_ID; } @@ -309,7 +310,5 @@ private function decorateItemDefinition(string $definitionName, \ArrayObject $de $definitions[$definitionName] = $allOf; unset($definitions[$definitionName]['allOf'][1]['description']); - - $this->transformed[$definitionName] = true; } }