Skip to content

Commit 30a4b13

Browse files
authored
Merge pull request #2674 from toriqo/2.4
publish to mercure using the default format and also respect the entity's serializer context
2 parents cb76832 + 6caaaa3 commit 30a4b13

File tree

3 files changed

+17
-6
lines changed

3 files changed

+17
-6
lines changed

src/Bridge/Doctrine/EventListener/PublishMercureUpdatesListener.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@ final class PublishMercureUpdatesListener
4747
private $createdEntities;
4848
private $updatedEntities;
4949
private $deletedEntities;
50+
private $formats;
5051

51-
public function __construct(ResourceClassResolverInterface $resourceClassResolver, IriConverterInterface $iriConverter, ResourceMetadataFactoryInterface $resourceMetadataFactory, SerializerInterface $serializer, MessageBusInterface $messageBus = null, callable $publisher = null, ExpressionLanguage $expressionLanguage = null)
52+
public function __construct(ResourceClassResolverInterface $resourceClassResolver, IriConverterInterface $iriConverter, ResourceMetadataFactoryInterface $resourceMetadataFactory, SerializerInterface $serializer, array $formats, MessageBusInterface $messageBus = null, callable $publisher = null, ExpressionLanguage $expressionLanguage = null)
5253
{
5354
if (null === $messageBus && null === $publisher) {
5455
throw new InvalidArgumentException('A message bus or a publisher must be provided.');
@@ -58,6 +59,7 @@ public function __construct(ResourceClassResolverInterface $resourceClassResolve
5859
$this->iriConverter = $iriConverter;
5960
$this->resourceMetadataFactory = $resourceMetadataFactory;
6061
$this->serializer = $serializer;
62+
$this->formats = $formats;
6163
$this->messageBus = $messageBus;
6264
$this->publisher = $publisher;
6365
$this->expressionLanguage = $expressionLanguage ?? class_exists(ExpressionLanguage::class) ? new ExpressionLanguage() : null;
@@ -157,7 +159,7 @@ private function storeEntityToPublish($entity, string $property): void
157159
}
158160

159161
/**
160-
* @param object|string $entity
162+
* @param object $entity
161163
*/
162164
private function publishUpdate($entity, array $targets): void
163165
{
@@ -168,8 +170,11 @@ private function publishUpdate($entity, array $targets): void
168170
$iri = $entity->iri;
169171
$data = json_encode(['@id' => $entity->id]);
170172
} else {
173+
$resourceClass = $this->getObjectClass($entity);
174+
$context = $this->resourceMetadataFactory->create($resourceClass)->getAttribute('normalization_context', []);
175+
171176
$iri = $this->iriConverter->getIriFromItem($entity, UrlGeneratorInterface::ABS_URL);
172-
$data = $this->serializer->serialize($entity, 'jsonld');
177+
$data = $this->serializer->serialize($entity, key($this->formats), $context);
173178
}
174179

175180
$update = new Update($iri, $data, $targets);

src/Bridge/Symfony/Bundle/Resources/config/doctrine_orm_mercure_publisher.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
<argument type="service" id="api_platform.iri_converter" />
1414
<argument type="service" id="api_platform.metadata.resource.metadata_factory" />
1515
<argument type="service" id="api_platform.serializer" />
16+
<argument>%api_platform.formats%</argument>
1617
<argument type="service" id="message_bus" on-invalid="ignore" />
1718
<argument type="service" id="mercure.hub.default.publisher" />
1819

tests/Bridge/Doctrine/EventListener/PublishMercureUpdatesListenerTest.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,15 @@ public function testPublishUpdate()
6666
$iriConverterProphecy->getIriFromItem($toDeleteExpressionLanguage, UrlGeneratorInterface::ABS_URL)->willReturn('http://example.com/dummy_friends/4')->shouldBeCalled();
6767

6868
$resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class);
69-
$resourceMetadataFactoryProphecy->create(Dummy::class)->willReturn(new ResourceMetadata(null, null, null, null, null, ['mercure' => true]));
69+
$resourceMetadataFactoryProphecy->create(Dummy::class)->willReturn(new ResourceMetadata(null, null, null, null, null, ['mercure' => true, 'normalization_context' => ['groups' => ['foo', 'bar']]]));
7070
$resourceMetadataFactoryProphecy->create(DummyCar::class)->willReturn(new ResourceMetadata());
7171
$resourceMetadataFactoryProphecy->create(DummyFriend::class)->willReturn(new ResourceMetadata(null, null, null, null, null, ['mercure' => "['foo', 'bar']"]));
7272

7373
$serializerProphecy = $this->prophesize(SerializerInterface::class);
74-
$serializerProphecy->serialize($toInsert, 'jsonld')->willReturn('1');
75-
$serializerProphecy->serialize($toUpdate, 'jsonld')->willReturn('2');
74+
$serializerProphecy->serialize($toInsert, 'jsonld', ['groups' => ['foo', 'bar']])->willReturn('1');
75+
$serializerProphecy->serialize($toUpdate, 'jsonld', ['groups' => ['foo', 'bar']])->willReturn('2');
76+
77+
$formats = ['jsonld' => ['application/ld+json'], 'jsonhal' => ['application/hal+json']];
7678

7779
$topics = [];
7880
$targets = [];
@@ -88,6 +90,7 @@ public function testPublishUpdate()
8890
$iriConverterProphecy->reveal(),
8991
$resourceMetadataFactoryProphecy->reveal(),
9092
$serializerProphecy->reveal(),
93+
$formats,
9194
null,
9295
$publisher
9396
);
@@ -118,6 +121,7 @@ public function testNoPublisher()
118121
$this->prophesize(IriConverterInterface::class)->reveal(),
119122
$this->prophesize(ResourceMetadataFactoryInterface::class)->reveal(),
120123
$this->prophesize(SerializerInterface::class)->reveal(),
124+
['jsonld' => ['application/ld+json'], 'jsonhal' => ['application/hal+json']],
121125
null,
122126
null
123127
);
@@ -145,6 +149,7 @@ public function testInvalidMercureAttribute()
145149
$iriConverterProphecy->reveal(),
146150
$resourceMetadataFactoryProphecy->reveal(),
147151
$serializerProphecy->reveal(),
152+
['jsonld' => ['application/ld+json'], 'jsonhal' => ['application/hal+json']],
148153
null,
149154
function (Update $update): string {
150155
return 'will never be called';

0 commit comments

Comments
 (0)