РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1356 of 1361 menu

Параметр handles атрибута AsMessageHandler

Атрибут AsMessageHandler вешается на класс-обработчик и регистрирует его в шине сообщений. Параметр handles задаёт массив классов сообщений, которые обрабатывает данный обработчик. Если параметр не указан, Symfony пытается определить класс сообщения автоматически по сигнатуре метода __invoke. Когда сообщение отправляется в шину, Symfony ищет обработчик, в параметре handles которого указан класс этого сообщения.

Синтаксис

#[AsMessageHandler(handles: [MessageClass::class])]

Пример

Давайте создадим класс сообщения SendEmailMessage и обработчик с явно указанным параметром handles:

<?php namespace AppMessage; class SendEmailMessage { public function __construct( public string $text, ) { } } ?>

Теперь создадим сам обработчик:

<?php namespace AppMessageHandler; use AppMessageSendEmailMessage; use SymfonyComponentMessengerAttributeAsMessageHandler; #[AsMessageHandler(handles: [SendEmailMessage::class])] class SendEmailMessageHandler { public function __invoke(SendEmailMessage $message): void { echo $message->text; } } ?>

Теперь отправим сообщение через шину:

<?php namespace AppController; use AppMessageSendEmailMessage; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationResponse; use SymfonyComponentMessengerMessageBusInterface; use SymfonyComponentRoutingAttributeRoute; class MessageController extends AbstractController { #[Route('/message', name: 'message_send')] public function send(MessageBusInterface $bus): Response { $bus->dispatch(new SendEmailMessage('hello')); return new Response('sent'); } } ?>

Результат выполнения кода для адреса /message:

"hello"

Пример

Параметр handles позволяет одному обработчику принимать несколько разных классов сообщений:

<?php namespace AppMessage; class FirstMessage { public function __construct( public string $text, ) { } } ?>
<?php namespace AppMessage; class SecondMessage { public function __construct( public string $text, ) { } } ?>

Теперь создадим обработчик, который принимает оба сообщения:

<?php namespace AppMessageHandler; use AppMessageFirstMessage; use AppMessageSecondMessage; use SymfonyComponentMessengerAttributeAsMessageHandler; #[AsMessageHandler(handles: [FirstMessage::class, SecondMessage::class])] class MultiMessageHandler { public function __invoke(object $message): void { echo $message->text; } } ?>

Отправим оба сообщения подряд:

<?php namespace AppController; use AppMessageFirstMessage; use AppMessageSecondMessage; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationResponse; use SymfonyComponentMessengerMessageBusInterface; use SymfonyComponentRoutingAttributeRoute; class MessageController extends AbstractController { #[Route('/multi', name: 'message_multi')] public function multi(MessageBusInterface $bus): Response { $bus->dispatch(new FirstMessage('abcde')); $bus->dispatch(new SecondMessage('article')); return new Response('sent'); } } ?>

Результат выполнения кода для адреса /multi:

"abcdearticle"

Смотрите также

  • атрибут AsMessageHandler,
    который регистрирует класс как обработчик сообщений
  • параметр bus,
    который указывает имя шины для обработчика
  • параметр priority,
    который задаёт приоритет обработчика
  • параметр method,
    который задаёт имя метода-обработчика
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить