diff --git a/src/Bridge/Symfony/Bundle/Resources/config/api.xml b/src/Bridge/Symfony/Bundle/Resources/config/api.xml index 67473b6fc91..eee710866e4 100644 --- a/src/Bridge/Symfony/Bundle/Resources/config/api.xml +++ b/src/Bridge/Symfony/Bundle/Resources/config/api.xml @@ -164,6 +164,7 @@ + diff --git a/src/EventListener/WriteListener.php b/src/EventListener/WriteListener.php index 26ae4829baa..9752cb66e43 100644 --- a/src/EventListener/WriteListener.php +++ b/src/EventListener/WriteListener.php @@ -14,6 +14,7 @@ namespace ApiPlatform\Core\EventListener; use ApiPlatform\Core\Api\IriConverterInterface; +use ApiPlatform\Core\Api\ResourceClassResolverInterface; use ApiPlatform\Core\DataPersister\DataPersisterInterface; use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface; use ApiPlatform\Core\Metadata\Resource\ToggleableOperationAttributeTrait; @@ -36,12 +37,14 @@ final class WriteListener private $dataPersister; private $iriConverter; private $resourceMetadataFactory; + private $resourceClassResolver; - public function __construct(DataPersisterInterface $dataPersister, IriConverterInterface $iriConverter = null, ResourceMetadataFactoryInterface $resourceMetadataFactory = null) + public function __construct(DataPersisterInterface $dataPersister, IriConverterInterface $iriConverter = null, ResourceMetadataFactoryInterface $resourceMetadataFactory = null, ResourceClassResolverInterface $resourceClassResolver = null) { $this->dataPersister = $dataPersister; $this->iriConverter = $iriConverter; $this->resourceMetadataFactory = $resourceMetadataFactory; + $this->resourceClassResolver = $resourceClassResolver; } /** @@ -90,6 +93,10 @@ public function onKernelView(GetResponseForControllerResultEvent $event): void $hasOutput = \array_key_exists('class', $outputMetadata) && null !== $outputMetadata['class'] && $controllerResult instanceof $outputMetadata['class']; } + if (null !== $this->resourceClassResolver && $hasOutput) { + $hasOutput = $this->resourceClassResolver->isResourceClass(\get_class($controllerResult)); + } + if ($hasOutput) { $request->attributes->set('_api_write_item_iri', $this->iriConverter->getIriFromItem($controllerResult)); }