Параметр 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,
который задаёт имя метода-обработчика