Skip to content

Commit bb068f2

Browse files
committed
Messenger persist using context resource_class
1 parent 526de3e commit bb068f2

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

src/Bridge/Symfony/Messenger/DataPersister.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
use ApiPlatform\Core\Api\OperationType;
1717
use ApiPlatform\Core\DataPersister\ContextAwareDataPersisterInterface;
18+
use ApiPlatform\Core\Exception\ResourceClassNotFoundException;
1819
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
1920
use ApiPlatform\Core\Util\ClassInfoTrait;
2021
use Symfony\Component\Messenger\Envelope;
@@ -46,7 +47,12 @@ public function __construct(ResourceMetadataFactoryInterface $resourceMetadataFa
4647
*/
4748
public function supports($data, array $context = []): bool
4849
{
49-
$resourceMetadata = $this->resourceMetadataFactory->create($this->getObjectClass($data));
50+
try {
51+
$resourceMetadata = $this->resourceMetadataFactory->create($context['resource_class'] ?? $this->getObjectClass($data));
52+
} catch (ResourceClassNotFoundException $e) {
53+
return false;
54+
}
55+
5056
if (null !== $operationName = $context['collection_operation_name'] ?? $context['item_operation_name'] ?? null) {
5157
return true === $resourceMetadata->getTypedOperationAttribute(
5258
$context['collection_operation_name'] ?? false ? OperationType::COLLECTION : OperationType::ITEM,

tests/Bridge/Symfony/Messenger/DataPersisterTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@
1515

1616
use ApiPlatform\Core\Bridge\Symfony\Messenger\DataPersister;
1717
use ApiPlatform\Core\Bridge\Symfony\Messenger\RemoveStamp;
18+
use ApiPlatform\Core\Exception\ResourceClassNotFoundException;
1819
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
1920
use ApiPlatform\Core\Metadata\Resource\ResourceMetadata;
2021
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\Dummy;
22+
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyCar;
2123
use PHPUnit\Framework\TestCase;
2224
use Prophecy\Argument;
2325
use Symfony\Component\Messenger\Envelope;
@@ -38,6 +40,17 @@ public function testSupport()
3840
$this->assertTrue($dataPersister->supports(new Dummy()));
3941
}
4042

43+
public function testSupportWithContext()
44+
{
45+
$metadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class);
46+
$metadataFactoryProphecy->create(Dummy::class)->willReturn(new ResourceMetadata(null, null, null, null, null, ['messenger' => true]));
47+
$metadataFactoryProphecy->create(DummyCar::class)->willThrow(new ResourceClassNotFoundException());
48+
49+
$dataPersister = new DataPersister($metadataFactoryProphecy->reveal(), $this->prophesize(MessageBusInterface::class)->reveal());
50+
$this->assertTrue($dataPersister->supports(new DummyCar(), ['resource_class' => Dummy::class]));
51+
$this->assertFalse($dataPersister->supports(new DummyCar()));
52+
}
53+
4154
public function testPersist()
4255
{
4356
$dummy = new Dummy();

0 commit comments

Comments
 (0)