veilletech.fr
30 oct. Feed du jour
#06 SYMFONY Article

Symfony 8.2 : Messenger lisible hors de PHP

Un message partagé n'a pas à savoir ce qu'est une classe PHP.

Symfony 8.2 ajoute messenger.transport.interop_serializer : les messages partent sans stamps PHP, avec un corps JSON et des en-têtes lisibles depuis n'importe quel langage. Des stamp header mappers conservent l'identité du message en en-têtes ordinaires. Sur un transport signé, l'ordre de mise à jour compte.

2 min de lectureintermédiairevidéo 1:32
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. Comment s'y prendre
  3. Ne pas perdre l'identité du message
  4. Le piège de la signature
  5. À retenir

Ce qui se passe

Quand un transport Messenger relie Symfony à un service tiers, un service de facturation en Go branché sur RabbitMQ par exemple, le sérialiseur Symfony joint les stamps au message. Cela pose deux problèmes côté réception : un stamp dont la classe manque ne se décode pas, et un BusNameStamp peut viser un bus inexistant.

Symfony 8.2 fournit le service messenger.transport.interop_serializer. À l'envoi il retire les stamps, à la réception il les ignore. Reste un corps JSON et quelques en-têtes simples. Seule exception : les messages renvoyés pour une nouvelle tentative ou vers le transport d'échec gardent leurs stamps, pour le comptage des essais.

Comment s'y prendre

Déclarez-le sur le transport partagé, dans chaque application Symfony qui l'utilise :

YAML
framework:
    messenger:
        transports:
            commandes:
                dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
                serializer: messenger.transport.interop_serializer

Remplacez ensuite la classe PHP de l'en-tête type par un nom stable, identique des deux côtés si l'autre application utilise aussi Messenger :

PHP
#[AsMessage(serializedTypeName: 'shop.order_placed')]
final class OrderPlaced {}

Si l'émetteur n'envoie aucun type (un service Python ou Node.js, par exemple), le transport accepte une classe fixe, ou une closure qui reçoit corps et en-têtes et renvoie le type, ou null. La syntaxe exacte figure dans le billet : ses exemples de configuration n'ont pas pu être relus pour cette fiche, et le bloc YAML ci-dessus reste la forme habituelle de Messenger.

Ne pas perdre l'identité du message

Sans stamps, chaque redélivraison recevrait un nouvel identifiant, et le destinataire ne reconnaîtrait plus un doublon. Les stamp header mappers y remédient :

Stamp En-tête
MessageIdStamp message_id
CorrelationStamp correlation_id
CausationStamp causation_id

Ces stamps n'existent qu'avec l'option identity_stamps. Pour transmettre un identifiant de client, implémentez StampHeaderMapperInterface : l'autoconfiguration branche votre classe sur le sérialiseur.

Le piège de la signature

Sur un transport signé, la signature porte sur tous les en-têtes écrits par le sérialiseur, sauf Content-Type, y compris ceux de vos mappers. Ceux ajoutés après sérialisation ne comptent pas.

Mais Symfony 7.4.18+ et 8.1.6+ rejettent les messages signés dont les en-têtes ne se limitent pas à type, Content-Type et X-Message-Stamp-*. Mettez donc à jour les consommateurs avant les émetteurs.

Source : Symfony, 29 octobre 2026. Source en anglais.