Nuevo en Symfony 4.1: componente Messenger
En Symfony 4.1 se ha añadido un nuevo componente Messenger que permite a las aplicaciones enviar/recibir mensajes hacia/desde otras aplicaciones mediante colas de mensajes. Este componente proporciona un "bus de mensajes" y un enrutador que puedes usar en cualquier servicio e incluso en cualquier controlador:
// src/Controller/DefaultController.php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Routing\Annotation\Route; class DefaultController extends Controller { /** * @Route("/", name="homepage") */ public function index(MessageBusInterface $bus) { // ... $bus->dispatch(new MyMessage()); } }
Enviar mensajes es solo el primer paso de un sistema de mensajería. El siguiente
paso es crear "message handlers" para procesar los mensajes. Estos handlers
se crean mediante servicios etiquetados con messenger.message_handler
:
// src/MessageHandler/MyMessageHandler.php namespace App\MessageHandler; class MyMessageHandler { public function __invoke(MyMessage $message) { // procesar el mensaje de alguna manera } }
Colas y adaptadores para AMQP
Este componente también incluye un adaptador listo para comunicarse con algunos de los brokers AMQP más populares, como por ejemplo RabbitMQ. La comunicación con otros sistemas de colas (Kafka, Amazon SQS, Google Pub/sub) se ha delegado por momento a librerías externas como Enqueue:
# config/packages/messenger.yaml framework: messenger: adapters: default: "amqp://guest:guest@localhost:5672/%2f/messages"
Esta configuración hace que los mensajes se enruten a
messenger.default_adapter
y también crea messenger.default_sender
y
messenger.default_receiver
para enrutar y consumir los mensajes
respectivamente.
Enrutamiento
En lugar de utilizar un handler, también puedes enrutar los mensajes a uno o más senders:
# config/packages/messenger.yaml framework: messenger: routing: # enruta este mensaje a un único sender 'My\Message\Message': messenger.default_sender # enruta este mensaje a varios senders 'My\Message\ToBeSentToTwoSenders': [messenger.default_sender, messenger.audit_sender] # enruta el resto de mensajes al sender por defecto '*': messenger.default_sender
Una vez enviados, los mensajes se pueden consumir con el comando
messenger:consume-messages
:
$ bin/console messenger:consume-messages messenger.default_receiver
El bus de mensajes creado por el componente Messenger se basa en middlewares. Puedes leer más sobre ello en la documentación del componente Messenger.
Esta funcionalidad fue contribuida por Samuel Roze en el pull request #24411.
Fuente: New in Symfony 4.1: Messenger component
Comentarios
Proyectos Symfony destacados
La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más
Síguenos en @symfony_es para acceder a las últimas noticias.