Introdução
O Symfony é um framework PHP muito poderoso e utilizado em diversas aplicações. Muitas vezes, nossas tarefas podem se tornar muito demoradas e pode ser necessário executá-las de forma assíncrona. Felizmente, o Symfony torna essa tarefa muito fácil com o uso do componente “Messenger”.
O que é o Symfony Messenger?
O Symfony Messenger é um componente que nos permite enviar mensagens entre diferentes partes da aplicação, de forma síncrona ou assíncrona. Ele é um componente opcional, mas pode ser instalado facilmente usando o Composer.
Como usar o Symfony Messenger para executar tarefas assíncronas?
Para executar uma tarefa assíncrona no Symfony usando o Messenger, primeiro precisamos criar uma mensagem que será enviada para o MessageBus. Essa mensagem pode ser uma simples classe PHP que contém as informações necessárias para executar a tarefa.
Aqui está um exemplo de uma classe mensagem simples que pode ser usada para enviar um e-mail assíncrono:
namespace AppMessage;
class SendEmailMessage
{
public $to;
public $subject;
public $body;
public function __construct(string $to, string $subject, string $body)
{
$this->to = $to;
$this->subject = $subject;
$this->body = $body;
}
}
Em seguida, precisamos criar um manipulador para a nossa mensagem. O manipulador será responsável por executar a tarefa real. No nosso exemplo, o manipulador seria responsável por enviar o e-mail.
namespace AppMessageHandler;
use AppMessageSendEmailMessage;
use SymfonyComponentMailerMailerInterface;
use SymfonyComponentMessengerHandlerMessageHandlerInterface;
class SendEmailHandler implements MessageHandlerInterface
{
private $mailer;
public function __construct(MailerInterface $mailer)
{
$this->mailer = $mailer;
}
public function __invoke(SendEmailMessage $message)
{
$email = (new Email())
->from('example@example.com')
->to($message->to)
->subject($message->subject)
->text($message->body);
$this->mailer->send($email);
}
}
Agora podemos enviar a nossa mensagem para o MessageBus, que irá enviar a mensagem para o seu respectivo manipulador. Para fazer isso, podemos usar a classe “MessageBusInterface”.
use AppMessageSendEmailMessage;
use SymfonyComponentMessengerMessageBusInterface;
class EmailController extends AbstractController
{
private $bus;
public function __construct(MessageBusInterface $bus)
{
$this->bus = $bus;
}
public function sendEmail()
{
$message = new SendEmailMessage('to@example.com', 'Hello', 'World!');
$this->bus->dispatch($message);
return $this->redirectToRoute('home');
}
}
Pronto, agora temos uma tarefa rodando assincronamente no Symfony! É importante notar que o Symfony irá empilhar essas tarefas e executá-las uma por vez, mas é possível configurar um sistema de mensagem para rodar em múltiplos servidores.
Conclusão
O Symfony Messenger é uma ferramenta muito poderosa para executar tarefas assíncronas no Symfony. Com apenas algumas linhas de código, podemos criar mensagens, manipuladores e enviar essas mensagens para o MessageBus. Isso faz com que a execução de tarefas demoradas seja muito fácil e ajuda a manter a nossa aplicação sempre responsiva para o usuário.