diff --git a/src/Bridge/Doctrine/EventListener/PublishMercureUpdatesListener.php b/src/Bridge/Doctrine/EventListener/PublishMercureUpdatesListener.php index f3bbb744a94..bd8ad5f156c 100644 --- a/src/Bridge/Doctrine/EventListener/PublishMercureUpdatesListener.php +++ b/src/Bridge/Doctrine/EventListener/PublishMercureUpdatesListener.php @@ -47,8 +47,9 @@ final class PublishMercureUpdatesListener private $createdEntities; private $updatedEntities; private $deletedEntities; + private $formats; - public function __construct(ResourceClassResolverInterface $resourceClassResolver, IriConverterInterface $iriConverter, ResourceMetadataFactoryInterface $resourceMetadataFactory, SerializerInterface $serializer, MessageBusInterface $messageBus = null, callable $publisher = null, ExpressionLanguage $expressionLanguage = null) + public function __construct(ResourceClassResolverInterface $resourceClassResolver, IriConverterInterface $iriConverter, ResourceMetadataFactoryInterface $resourceMetadataFactory, SerializerInterface $serializer, MessageBusInterface $messageBus = null, callable $publisher = null, array $formats, ExpressionLanguage $expressionLanguage = null) { if (null === $messageBus && null === $publisher) { throw new InvalidArgumentException('A message bus or a publisher must be provided.'); @@ -60,6 +61,7 @@ public function __construct(ResourceClassResolverInterface $resourceClassResolve $this->serializer = $serializer; $this->messageBus = $messageBus; $this->publisher = $publisher; + $this->formats = $formats; $this->expressionLanguage = $expressionLanguage ?? class_exists(ExpressionLanguage::class) ? new ExpressionLanguage() : null; $this->reset(); } @@ -168,8 +170,13 @@ private function publishUpdate($entity, array $targets): void $iri = $entity->iri; $data = json_encode(['@id' => $entity->id]); } else { + // publish the message in the request's format + // respect the entity's serializer context + $resourceClass = $this->getObjectClass($entity); + $context = $this->resourceMetadataFactory->create($resourceClass)->getAttribute('normalization_context', []); + $iri = $this->iriConverter->getIriFromItem($entity, UrlGeneratorInterface::ABS_URL); - $data = $this->serializer->serialize($entity, 'jsonld'); + $data = $this->serializer->serialize($entity, key($this->formats), $context); } $update = new Update($iri, $data, $targets); diff --git a/src/Bridge/Symfony/Bundle/Resources/config/doctrine_orm_mercure_publisher.xml b/src/Bridge/Symfony/Bundle/Resources/config/doctrine_orm_mercure_publisher.xml index bf806e60986..1c218e13287 100644 --- a/src/Bridge/Symfony/Bundle/Resources/config/doctrine_orm_mercure_publisher.xml +++ b/src/Bridge/Symfony/Bundle/Resources/config/doctrine_orm_mercure_publisher.xml @@ -15,6 +15,7 @@ + %api_platform.formats%