Параметр method атрибута AsMessageHandler
Атрибут AsMessageHandler вешается на класс
обработчика сообщения. По умолчанию Symfony вызывает
метод __invoke этого класса. Параметр method
позволяет явно указать имя другого метода, который
должен обрабатывать сообщение. Это удобно, когда
класс содержит несколько методов-обработчиков или
когда имя метода отличается от __invoke.
Синтаксис
#[AsMessageHandler(method: 'methodName')]
Пример
Давайте создадим класс-обработчик с методом handle
и укажем его через параметр method:
<?php
namespace AppMessageHandler;
use AppMessageArticleMessage;
use SymfonyComponentMessengerAttributeAsMessageHandler;
#[AsMessageHandler(method: 'handle')]
class ArticleMessageHandler
{
public function handle(ArticleMessage $message): void
{
echo 'handled: ' . $message->getText();
}
}
?>
Теперь при отправке сообщения ArticleMessage
Symfony вызовет метод handle, а не __invoke.
Пример
Давайте отправим сообщение через шину и посмотрим результат работы обработчика:
<?php
namespace AppController;
use AppMessageArticleMessage;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentMessengerMessageBusInterface;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_send')]
public function send(MessageBusInterface $bus): Response
{
$bus->dispatch(new ArticleMessage('hello'));
return new Response('sent');
}
}
?>
Результат выполнения кода:
handled: hello
Пример
Давайте создадим класс с двумя обработчиками и разными методами для каждого типа сообщения:
<?php
namespace AppMessageHandler;
use AppMessageArticleMessage;
use AppMessageUserMessage;
use SymfonyComponentMessengerAttributeAsMessageHandler;
class MultiMessageHandler
{
#[AsMessageHandler(method: 'handleArticle')]
public function handleArticle(ArticleMessage $message): void
{
echo 'article: ' . $message->getText();
}
#[AsMessageHandler(method: 'handleUser')]
public function handleUser(UserMessage $message): void
{
echo 'user: ' . $message->getName();
}
}
?>
При отправке ArticleMessage вызовется метод
handleArticle, а при отправке UserMessage -
метод handleUser.
Смотрите также
-
атрибут
AsMessageHandler,
который помечает класс как обработчик сообщений -
параметр
bus,
который задаёт шину для обработчика -
параметр
priority,
который задаёт приоритет обработчика -
параметр
handles,
который задаёт тип обрабатываемого сообщения