Symfony Messenger to komponent, który umożliwia obsługę wiadomości w systemie, zapewniając łatwą i efektywną komunikację pomiędzy różnymi częściami aplikacji.
Pracuje on na zasadzie wzorca Message Bus, co pozwala efektywnie organizować przepływ danych między różnymi elementami systemu.
Pozwala na realizację takich wzorców jak CQRS (Command Query Responsibility Segregation), a także ułatwia zarządzanie asynchronicznymi zadaniami w aplikacjach Symfony.
Historia Symfony Messenger
Symfony Messenger zadebiutował w wersji Symfony 4.1, wydanej w maju 2018 roku. Celem jego wprowadzenia było ułatwienie pracy programistom Symfony, szczególnie przy realizacji zadań związanych z obsługą asynchronicznych wiadomości i kolejek.
Wprowadzenie tego komponentu było odpowiedzią na rosnące potrzeby dotyczące obsługi złożonych operacji w czasie rzeczywistym oraz potrzeby łatwego integrowania aplikacji z systemami opartymi na mikrousługach.
Messenger początkowo miał być prostym narzędziem do obsługi wiadomości wewnątrz aplikacji. Wkrótce jednak rozwinął się do pełnoprawnego komponentu do zarządzania komunikacją asynchroniczną, z obsługą kolejek takich jak RabbitMQ, Amazon SQS, Redis czy Doctrine DBAL.
Obecnie Symfony Messenger to jedno z głównych narzędzi dla aplikacji wymagających wysokiej wydajności i skalowalności.
Dlaczego Symfony Messenger jest potrzebny?
Symfony Messenger pomaga w rozdzielaniu zadań wewnątrz aplikacji, szczególnie tych, które nie muszą być wykonane natychmiast.
Główne zastosowania Symfony Messenger obejmują:
✅ Obsługę asynchronicznych zadań
Messenger pozwala na przesyłanie zadań do kolejki, co umożliwia ich realizację w tle, bez konieczności oczekiwania przez użytkownika.
Jest to niezwykle przydatne przy operacjach wymagających dużych zasobów lub długiego czasu wykonania, takich jak wysyłanie e-maili, przetwarzanie dużych ilości danych czy generowanie raportów.
✅ Implementację wzorca CQRS
Symfony Messenger doskonale sprawdza się w realizacji wzorca CQRS, który polega na rozdzieleniu operacji zapisu (komend) od operacji odczytu (zapytań).
Messenger wspiera to podejście, umożliwiając tworzenie dedykowanych handlerów dla komend i zapytań.
✅ Integrację z mikrousługami
W aplikacjach opartych na architekturze mikrousług Messenger może służyć jako narzędzie do przekazywania wiadomości pomiędzy poszczególnymi usługami, umożliwiając ich współpracę i wymianę danych bez blokowania głównej aplikacji.
✅ Rezygnacja z zapytań HTTP do komunikacji wewnętrznej
Messenger pozwala na unikanie nadmiaru zapytań HTTP w przypadku komunikacji pomiędzy różnymi częściami aplikacji.
Dzięki użyciu kolejek możliwe jest bardziej efektywne zarządzanie przepływem danych.
Kluczowe elementy architektury Symfony Messenger’a

Sender (Nadawca)
Nadawca to komponent odpowiedzialny za serializowanie i wysyłanie wiadomości do miejsca docelowego, którym może być broker wiadomości (np. RabbitMQ, Kafka) lub zewnętrzne API.
Nadawca zamienia wiadomość na format odpowiedni do przesłania i kieruje ją do odpowiedniego transportu.
Receiver (Odbiorca)
Odbiorca zajmuje się odbiorem i deserializacją wiadomości, po czym przekazuje ją do odpowiednich handlerów, czyli modułów zajmujących się przetwarzaniem wiadomości.
Typowy odbiorca może pełnić funkcję czytnika kolejki wiadomości lub punktu końcowego API.
Handler (Obsługujący)
Handler to komponent, który stosuje logikę biznesową odpowiednią dla konkretnej wiadomości. Każdy handler jest wywoływany przez warstwę HandleMessageMiddleware
i przetwarza komunikaty, wykonując określone operacje w zależności od typu wiadomości.
Może to być zapis danych w bazie, wysłanie powiadomienia, czy wykonanie innej logiki biznesowej.
Middleware
Middleware to „oprogramowanie pośrednie”, które pozwala na dostęp do wiadomości oraz ich „kopert” (envelope) podczas przechodzenia przez bus wiadomości.
Środowisko middleware nie odnosi się do głównych zadań aplikacji (logiki biznesowej), ale do czynności ogólnych, które są stosowane na poziomie całego busa wiadomości – takich jak logowanie, walidacja, czy rozpoczęcie transakcji.
Middleware wywołuje także kolejne elementy w łańcuchu, co pozwala na dodanie dodatkowych informacji lub zmianę właściwości wiadomości. Middleware działa zarówno przy pierwotnym wysłaniu wiadomości, jak i przy jej odebraniu.
Envelope (Koperta)
Koperta to pojęcie specyficzne dla Symfony Messenger, które wprowadza elastyczność do pracy z bus wiadomości. Koperta opakowuje wiadomość, co pozwala na dołączanie do niej dodatkowych informacji poprzez “stamps” (pieczęcie).
Dzięki temu możliwe jest dodawanie kontekstu do wiadomości na każdym etapie jej cyklu życia.
Envelope Stamps (Pieczęcie Koperty)
Pieczęcie to dodatkowe informacje, które możemy dołączyć do wiadomości, np. kontekst serializatora dla transportu, znaczniki identyfikujące odebraną wiadomość lub metadane wykorzystywane przez middleware czy warstwę transportu.
Dzięki pieczęciom możemy kontrolować szczegóły przekazywania wiadomości w systemie, dopasowując ich obsługę do specyficznych potrzeb.
Symfony Messenger w Praktyce
Przyjrzyjmy się prostemu przykładowi użycia Symfony Messenger, w którym chcemy wysłać e-mail powitalny nowemu użytkownikowi.
W pierwszej kolejności tworzymy wiadomość, która zawiera dane potrzebne do wysłania e-maila. Następnie definiujemy handler, który przetworzy tę wiadomość i wykona odpowiednie zadanie.
Instalacja Messenger
Aby rozpocząć pracę z Symfony Messenger, musimy zainstalować go w naszej aplikacji:
composer require symfony/messenger
Utworzenie wiadomości
Tworzymy prostą wiadomość (WelcomeEmail) zawierającą dane użytkownika, które będą potrzebne do wysłania e-maila.
namespace App\Message; class WelcomeEmail { public function __construct( private string $userEmail ) {} public function getUserEmail(): string { return $this->userEmail; } }
Definicja handlera
Handler to klasa, która przetwarza wiadomość i wykonuje związane z nią zadanie.
Tutaj dodajemy kod do wysyłania e-maila powitalnego.
namespace App\MessageHandler; use App\Message\WelcomeEmail; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Mime\Email; class WelcomeEmailHandler implements MessageHandlerInterface { public function __construct( private MailerInterface $mailer ) {} public function __invoke(WelcomeEmail $message) { $email = (new Email()) ->from('[email protected]') ->to($message->getUserEmail()) ->subject('Welcome to Our App') ->text('Thank you for signing up! We are excited to have you on board.'); $this->mailer->send($email); } }
Wysyłanie wiadomości do kolejki
W naszym kontrolerze lub serwisie możemy teraz wysyłać wiadomości do Symfony Messenger:
namespace App\Controller; use App\Message\WelcomeEmail; use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class UserController extends AbstractController { public function registerUser(MessageBusInterface $bus, string $userEmail) { // Rejestrujemy nowego użytkownika (przykładowo) ... // Wysyłamy wiadomość do kolejki $bus->dispatch(new WelcomeEmail($userEmail)); return $this->json(['status' => 'User registered and welcome email scheduled.']); } }
Konfiguracja Messenger do obsługi kolejek
Na koniec musimy skonfigurować Symfony Messenger, aby pracował z wybraną kolejką, np. Redis lub RabbitMQ.
Konfiguracja w pliku config/packages/messenger.yaml
pozwala na zdefiniowanie dostawcy wiadomości:
framework: messenger: transports: async: '%env(MESSENGER_TRANSPORT_DSN)%' # np. amqp://guest:guest@localhost:5672/%2f routing: 'App\Message\WelcomeEmail': async
Podsumowanie
Symfony Messenger to wszechstronny komponent, który sprawdzi się wszędzie tam, gdzie wymagane jest wykonywanie zadań asynchronicznych, rozdzielanie odpowiedzialności między komendy i zapytania oraz usprawnienie komunikacji między częściami aplikacji.
Jego elastyczność i obsługa różnych kolejek sprawiają, że Messenger to narzędzie kluczowe w nowoczesnych aplikacjach Symfony.
Nikt jeszcze nie komentował. Bądź pierwszy!