Componente Messenger Adicionado no Symfony 4.1
No Symfony 4.1, foi adicionado o novo componente Messenger que ajuda as aplicações a enviar e receber mensagens de/para outras aplicações ou através de filas de mensagens. Ele fornece um barramento de mensagens e alguns recursos de roteamento para enviar mensagens a partir de qualquer serviço onde você precisar, como em um 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());
}
}
O envio de mensagens é a primeira parte do processo. Em seguida, você precisa criar um “manipulador (handler) de mensagens” e registrá-lo como um serviço com a tag messenger.message_handler
para receber a mensagem e fazer algo com ela:
// src/MessageHandler/MyMessageHandler.php
namespace App\MessageHandler;
class MyMessageHandler
{
public function __invoke(MyMessage $message)
{
// do something with the message
}
}
Filas e Adaptadores AMQP
O componente inclui um adaptador AMQP pronto para se comunicar com a maioria dos brokers populares do AMQP, como o RabbitMQ. A comunicação com sistemas de enfileiramento ou de terceiros (Kafka, Amazon SQS, Google Pub/sub) é delegada a bibliotecas como o adaptador Enqueue:
# config/packages/messenger.yaml
framework:
messenger:
adapters:
default: "amqp://guest:guest@localhost:5672/%2f/messages"
Essa configuração permite rotear mensagens para o messenger.default_adapter
e também configura um messenger.default_sender
e messenger.default_receiver
para ser usado ao rotear e consumir mensagens.
Roteamento
Em vez de chamar um manipulador (handler), você também pode rotear suas mensagens para um ou vários remetentes:
# config/packages/messenger.yaml
framework:
messenger:
routing:
# route this message to a single sender
'My\Message\Message': messenger.default_sender
# route this message to multiple senders
'My\Message\ToBeSentToTwoSenders': [messenger.default_sender, messenger.audit_sender]
# route the rest of messages to the default sender
'*': messenger.default_sender
Uma vez que suas mensagens foram roteadas, você pode consumi-las com o comando messenger:consume-messages
:
$ bin/console messenger:consume-messages messenger.default_receiver
O barramento de mensagens definido pelo componente Messenger é baseado em middleware. Você pode ler mais sobre isso e outros recursos do Messenger no último rascunho de sua documentação.
Tradução de: New in Symfony 4.1: Messenger component