Broker transports
The BabelQueue adapter is a Messenger serializer, not a transport. It encodes and decodes the canonical envelope on whatever Messenger transport you configure — so Symfony interoperates over any broker Messenger can reach, and there is no broker-specific “BabelQueue transport” to install. Point a transport at the serializer and you are done:
# config/packages/messenger.yaml
framework:
messenger:
transports:
babel:
dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
serializer: 'babelqueue.messenger.serializer'
Built-in transports (RabbitMQ, Redis)
Messenger ships first-party transports for AMQP (RabbitMQ — §2) and Redis (§1). Set the DSN and the serializer; a Go / Python / Laravel / … consumer on the same broker reads the byte-identical envelope:
# RabbitMQ
MESSENGER_TRANSPORT_DSN=amqp://guest:guest@localhost:5672/%2f/orders
# …or Redis
MESSENGER_TRANSPORT_DSN=redis://localhost:6379/messages
These are the GA path for Symfony; see the broker setup recipes for the cross-language pairings.
Beyond the built-ins (Kafka, Pulsar, Artemis/AMQP 1.0)
Messenger has no first-party transport for Kafka (§6),
Pulsar (§5) or Artemis over AMQP 1.0
(§7). You do not need a BabelQueue-specific transport
for them — use a third-party Messenger transport for that broker and wire the same
babelqueue.messenger.serializer onto it. The serializer puts the canonical envelope in the
message body, so the wire format is identical regardless of which transport carries it.
framework:
messenger:
transports:
babel-kafka:
dsn: '%env(KAFKA_TRANSPORT_DSN)%' # from a community Kafka Messenger transport
serializer: 'babelqueue.messenger.serializer'
Interop is body-authoritative. A cross-language consumer routes on the body’s
jobURN, which is always present — so a Symfony-produced message is consumed correctly on any of these brokers even when the transport doesn’t reproduce the binding’s native property projection (AMQPtype, Pulsar/Kafkabq-jobheader, …). The serializer also emits the cross-brokerbq-*headers (bq-job,bq-trace-id,bq-message-id,bq-schema-version,bq-source-lang,bq-attempts); a transport that maps serializer headers onto native broker headers (e.g. a Kafka Messenger transport → Kafka record headers) carries them through, so consumers can also route without decoding the body.
When you want the native projection
If you need the exact native projection of a binding (so non-PHP consumers route on the
broker-native field — AMQP type, SQS MessageAttributes, the Pulsar/Kafka bq- headers,
the Artemis STOMP framing), reach for the framework-less
babelqueue/php-sdk transports directly instead of going
through Messenger:
| Broker | Native produce / consume on php-sdk |
|---|---|
| Apache Kafka (§6) | KafkaTransport (produce) · KafkaConsumer + retry topics (consume) |
| Apache Pulsar (§5) | PulsarTransport (produce) · PulsarConsumer (consume) |
| Apache Artemis (§7) | StompTransport (produce); Laravel ships the babelqueue-artemis consume driver |
| Amazon SQS (§3) | SqsTransport |
These emit the binding’s native bq-/property projection verbatim. The envelope is the same
schema_version: 1 either way — Messenger-serializer or framework-less transport is purely a
wiring choice.