Как подключить Symfony Messenger?

Для подключения Symfony Messenger в свой проект вам нужно выполнить несколько шагов.

1. Установка зависимости
Для начала установите компонент symfony/messenger с помощью Composer. Запустите команду:

   composer require symfony/messenger

2. Регистрация бандла
Откройте файл config/bundles.php и убедитесь, что у вас есть следующая строка:

   SymfonyBundleMessengerBundleMessengerBundle::class => ['all' => true],

3. Конфигурация драйвера транспорта сообщений
В Symfony Messenger есть несколько встроенных драйверов для транспорта сообщений, таких как AMQP, Redis и Doctrine.
Для настройки драйвера выберите один из них, добавьте его параметры в файл config/packages/messenger.yaml.

   framework:
       messenger:
           transports:
               async: '%env(MESSENGER_TRANSPORT_DSN)%'

4. Определение обработчиков сообщений
Для обработки входящих сообщений вы должны определить соответствующие обработчики.
Создайте новый класс, который реализует интерфейс SymfonyComponentMessengerHandlerMessageHandlerInterface
и пометьте его атрибутом #[SymfonyComponentMessengerHandlerMessageHandler].
Например:

   <?php
   
   namespace AppMessageHandler;
   
   use AppMessageMyMessage;
   
   #[SymfonyComponentMessengerHandlerMessageHandler]
   class MyMessageHandler implements SymfonyComponentMessengerHandlerMessageHandlerInterface
   {
       public function __invoke(MyMessage $message)
       {
           // Обработка сообщения
       }
   }

5. Определение маршрутов сообщений
Чтобы сообщения были доставлены к соответствующим обработчикам, вам нужно определить маршруты.
Создайте новый класс, который реализует интерфейс SymfonyComponentMessengerRoutingRouteLocatorInterface.
Метод getRouteCollection() должен вернуть коллекцию маршрутов.
Например:

   <?php
   
   namespace AppMessage;
   
   use SymfonyComponentMessengerTransportReceiverRoutingRouteCollection;
   use SymfonyComponentMessengerTransportReceiverRoutingRouteLocatorInterface;
   
   class MessengerRouteLocator implements RouteLocatorInterface
   {
       public function getRouteCollection(): RouteCollection
       {
           $routeCollection = new RouteCollection();
   
           $routeCollection->add('my_message', new SymfonyComponentMessengerTransportReceiverCallableReceiver(function ($message) {
               // Подходящий обработчик должен быть выбран на основе настроек маршрута
               // и передан выбранному обработчику.
               // Пример:
               return new MyMessageHandler($message);
           }));
   
           return $routeCollection;
       }
   }

6. Конфигурация маршрутизации
Откройте файл config/services.yaml и добавьте следующую строку, чтобы зарегистрировать вновь созданный маршрутизатор:

   services:
       AppMessageMessengerRouteLocator:
           tags: ['messenger.receiver_locator']

7. Отправка сообщений
Теперь вы можете отправить сообщения из своих контроллеров или сервисов, используя класс SymfonyComponentMessengerMessageBusInterface.
Например:

   <?php
   
   namespace AppController;
   
   use AppMessageMyMessage;
   use SymfonyComponentHttpFoundationResponse;
   use SymfonyComponentMessengerMessageBusInterface;
   use SymfonyComponentRoutingAnnotationRoute;
   
   class MyController
   {
       #[Route('/send-message')]
       public function sendMessage(MessageBusInterface $messageBus): Response
       {
           $messageBus->dispatch(new MyMessage('Hello, Messenger!'));
   
           return new Response('Message sent!');
       }
   }

Это основные шаги для успешного подключения и использования Symfony Messenger в вашем проекте. Теперь вы можете легко передавать сообщения и обрабатывать их с помощью обработчиков.