From 2edf04cb24faf34cf092c705799f94f6b2ba9e59 Mon Sep 17 00:00:00 2001 From: soyuka Date: Tue, 7 May 2024 13:46:27 +0200 Subject: [PATCH] fix(symfony): no read should not throw on wrong uri variables fixes #6358 --- src/Serializer/SerializerContextBuilder.php | 2 +- src/State/Processor/SerializeProcessor.php | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Serializer/SerializerContextBuilder.php b/src/Serializer/SerializerContextBuilder.php index ee17ba56090..b7730c1f88a 100644 --- a/src/Serializer/SerializerContextBuilder.php +++ b/src/Serializer/SerializerContextBuilder.php @@ -81,7 +81,7 @@ public function createFromRequest(Request $request, bool $normalization, ?array } } - if (($options = $operation?->getStateOptions()) && $options instanceof Options && $options->getEntityClass()) { + if (null === $context['output'] && ($options = $operation?->getStateOptions()) && $options instanceof Options && $options->getEntityClass()) { $context['force_resource_class'] = $operation->getClass(); } diff --git a/src/State/Processor/SerializeProcessor.php b/src/State/Processor/SerializeProcessor.php index a2cc9da24dd..eccc2d8b553 100644 --- a/src/State/Processor/SerializeProcessor.php +++ b/src/State/Processor/SerializeProcessor.php @@ -51,8 +51,14 @@ public function process(mixed $data, Operation $operation, array $uriVariables = // @see ApiPlatform\State\Processor\RespondProcessor $context['original_data'] = $data; + $class = $operation->getClass(); + if ($request->attributes->get('_api_resource_class') !== $operation->getClass()) { + $class = $request->attributes->get('_api_resource_class'); + trigger_deprecation('api-platform/core', '3.3', 'The resource class on the router is not the same as the operation\'s class which leads to wrong behaviors. Prefer using "stateOptions" if you need to change the entity class.'); + } + $serializerContext = $this->serializerContextBuilder->createFromRequest($request, true, [ - 'resource_class' => $operation->getClass(), + 'resource_class' => $class, 'operation' => $operation, ]);