From bb068f2b8098097644a31d426ca41c4d350eb13e Mon Sep 17 00:00:00 2001 From: soyuka Date: Fri, 8 Mar 2019 11:27:24 +0100 Subject: [PATCH] Messenger persist using context resource_class --- src/Bridge/Symfony/Messenger/DataPersister.php | 8 +++++++- .../Bridge/Symfony/Messenger/DataPersisterTest.php | 13 +++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/Bridge/Symfony/Messenger/DataPersister.php b/src/Bridge/Symfony/Messenger/DataPersister.php index a017743b4ac..c85d5c9385b 100644 --- a/src/Bridge/Symfony/Messenger/DataPersister.php +++ b/src/Bridge/Symfony/Messenger/DataPersister.php @@ -15,6 +15,7 @@ use ApiPlatform\Core\Api\OperationType; use ApiPlatform\Core\DataPersister\ContextAwareDataPersisterInterface; +use ApiPlatform\Core\Exception\ResourceClassNotFoundException; use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface; use ApiPlatform\Core\Util\ClassInfoTrait; use Symfony\Component\Messenger\Envelope; @@ -46,7 +47,12 @@ public function __construct(ResourceMetadataFactoryInterface $resourceMetadataFa */ public function supports($data, array $context = []): bool { - $resourceMetadata = $this->resourceMetadataFactory->create($this->getObjectClass($data)); + try { + $resourceMetadata = $this->resourceMetadataFactory->create($context['resource_class'] ?? $this->getObjectClass($data)); + } catch (ResourceClassNotFoundException $e) { + return false; + } + if (null !== $operationName = $context['collection_operation_name'] ?? $context['item_operation_name'] ?? null) { return true === $resourceMetadata->getTypedOperationAttribute( $context['collection_operation_name'] ?? false ? OperationType::COLLECTION : OperationType::ITEM, diff --git a/tests/Bridge/Symfony/Messenger/DataPersisterTest.php b/tests/Bridge/Symfony/Messenger/DataPersisterTest.php index 4adbeb24f9c..5d2d28414b3 100644 --- a/tests/Bridge/Symfony/Messenger/DataPersisterTest.php +++ b/tests/Bridge/Symfony/Messenger/DataPersisterTest.php @@ -15,9 +15,11 @@ use ApiPlatform\Core\Bridge\Symfony\Messenger\DataPersister; use ApiPlatform\Core\Bridge\Symfony\Messenger\RemoveStamp; +use ApiPlatform\Core\Exception\ResourceClassNotFoundException; use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface; use ApiPlatform\Core\Metadata\Resource\ResourceMetadata; use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\Dummy; +use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyCar; use PHPUnit\Framework\TestCase; use Prophecy\Argument; use Symfony\Component\Messenger\Envelope; @@ -38,6 +40,17 @@ public function testSupport() $this->assertTrue($dataPersister->supports(new Dummy())); } + public function testSupportWithContext() + { + $metadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class); + $metadataFactoryProphecy->create(Dummy::class)->willReturn(new ResourceMetadata(null, null, null, null, null, ['messenger' => true])); + $metadataFactoryProphecy->create(DummyCar::class)->willThrow(new ResourceClassNotFoundException()); + + $dataPersister = new DataPersister($metadataFactoryProphecy->reveal(), $this->prophesize(MessageBusInterface::class)->reveal()); + $this->assertTrue($dataPersister->supports(new DummyCar(), ['resource_class' => Dummy::class])); + $this->assertFalse($dataPersister->supports(new DummyCar())); + } + public function testPersist() { $dummy = new Dummy();