From 8e4aa23d1e5d0f4fc27edace1ff7164079727007 Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Wed, 1 Oct 2025 09:56:50 +0200 Subject: [PATCH] Expose resource data --- src/Laravel/Controller/ApiPlatformController.php | 1 + src/State/Provider/ObjectMapperProvider.php | 1 + src/State/Provider/ReadProvider.php | 1 + src/Symfony/Controller/MainController.php | 1 + src/Symfony/EventListener/WriteListener.php | 1 + src/Symfony/Tests/EventListener/WriteListenerTest.php | 5 +++-- 6 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Laravel/Controller/ApiPlatformController.php b/src/Laravel/Controller/ApiPlatformController.php index d7c59b6f8f7..2b397312ef0 100644 --- a/src/Laravel/Controller/ApiPlatformController.php +++ b/src/Laravel/Controller/ApiPlatformController.php @@ -85,6 +85,7 @@ public function __invoke(Request $request): Response $uriVariables = $this->getUriVariables($request, $operation); } + $context['resource'] = $request->attributes->get('resource'); $context['previous_data'] = $request->attributes->get('previous_data'); $context['data'] = $request->attributes->get('data'); diff --git a/src/State/Provider/ObjectMapperProvider.php b/src/State/Provider/ObjectMapperProvider.php index b19d9758b3e..6dc5aab5381 100644 --- a/src/State/Provider/ObjectMapperProvider.php +++ b/src/State/Provider/ObjectMapperProvider.php @@ -69,6 +69,7 @@ public function provide(Operation $operation, array $uriVariables = [], array $c $data = $this->objectMapper->map($data, $operation->getClass()); } + $request?->attributes->set('resource', $data); $request?->attributes->set('data', $data); $request?->attributes->set('previous_data', $this->clone($data)); diff --git a/src/State/Provider/ReadProvider.php b/src/State/Provider/ReadProvider.php index 0e1abf17c34..5a13b091ffd 100644 --- a/src/State/Provider/ReadProvider.php +++ b/src/State/Provider/ReadProvider.php @@ -98,6 +98,7 @@ public function provide(Operation $operation, array $uriVariables = [], array $c throw new NotFoundHttpException('Not Found', $e ?? null); } + $request?->attributes->set('resource', $data); $request?->attributes->set('data', $data); $request?->attributes->set('previous_data', $this->clone($data)); diff --git a/src/Symfony/Controller/MainController.php b/src/Symfony/Controller/MainController.php index b609d11609a..fa3fa58f3bf 100644 --- a/src/Symfony/Controller/MainController.php +++ b/src/Symfony/Controller/MainController.php @@ -109,6 +109,7 @@ public function __invoke(Request $request): Response } } + $context['resource'] = $request->attributes->get('resource'); $context['previous_data'] = $request->attributes->get('previous_data'); $context['data'] = $request->attributes->get('data'); diff --git a/src/Symfony/EventListener/WriteListener.php b/src/Symfony/EventListener/WriteListener.php index c74c140d356..4e202fc8c03 100644 --- a/src/Symfony/EventListener/WriteListener.php +++ b/src/Symfony/EventListener/WriteListener.php @@ -81,6 +81,7 @@ public function onKernelView(ViewEvent $event): void 'request' => $request, 'uri_variables' => $uriVariables, 'resource_class' => $operation->getClass(), + 'resource' => false === $operation->canRead() ? null : $request->attributes->get('resource'), 'previous_data' => false === $operation->canRead() ? null : $request->attributes->get('previous_data'), ]); diff --git a/src/Symfony/Tests/EventListener/WriteListenerTest.php b/src/Symfony/Tests/EventListener/WriteListenerTest.php index 9b53bbf4ad4..9a14900493a 100644 --- a/src/Symfony/Tests/EventListener/WriteListenerTest.php +++ b/src/Symfony/Tests/EventListener/WriteListenerTest.php @@ -78,12 +78,13 @@ public function testCallProcessorContext(): void $operation = new Get(class: \stdClass::class); $controllerResult = new \stdClass(); $originalData = new \stdClass(); + $resource = new \stdClass(); $uriVariables = ['id' => 3]; $returnValue = new \stdClass(); - $request = new Request([], [], ['_api_operation' => $operation, '_api_operation_name' => 'operation', '_api_resource_class' => \stdClass::class, '_api_uri_variables' => $uriVariables, 'previous_data' => $originalData]); + $request = new Request([], [], ['_api_operation' => $operation, '_api_operation_name' => 'operation', '_api_resource_class' => \stdClass::class, '_api_uri_variables' => $uriVariables, 'previous_data' => $originalData, 'resource' => $resource]); $processor = $this->createMock(ProcessorInterface::class); $processor->expects($this->once())->method('process') - ->with($controllerResult, $operation, $uriVariables, ['request' => $request, 'uri_variables' => $uriVariables, 'resource_class' => \stdClass::class, 'previous_data' => $originalData])->willReturn($returnValue); + ->with($controllerResult, $operation, $uriVariables, ['request' => $request, 'uri_variables' => $uriVariables, 'resource_class' => \stdClass::class, 'resource' => $resource, 'previous_data' => $originalData])->willReturn($returnValue); $metadata = $this->createStub(ResourceMetadataCollectionFactoryInterface::class); $listener = new WriteListener($processor, $metadata); $listener->onKernelView(