Параметр bus атрибута AsMessageHandler
Параметр bus атрибута AsMessageHandler
привязывает обработчик сообщения к конкретной шине
сообщений. По умолчанию Symfony использует шину
default (или messenger.bus.default), но
если в проекте объявлено несколько шин, параметр
позволяет явно указать, какую именно шину должен
обслуживать данный обработчик.
Значением параметра выступает имя шины, заданное
в конфигурации framework.messenger.buses.
Если параметр не указан, обработчик попадает в шину
по умолчанию.
Синтаксис
#[AsMessageHandler(bus: 'bus_name')]
Пример
Давайте создадим класс-сообщение UserMessage
и обработчик, привязанный к шине 'command.bus':
<?php
namespace App\Message;
class UserMessage
{
public function __construct(
public string $text
) {
}
}
?>
<?php
namespace App\MessageHandler;
use App\Message\UserMessage;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler(bus: 'command.bus')]
class UserMessageHandler
{
public function __invoke(UserMessage $message): void
{
echo $message->text;
}
}
?>
Обработчик сработает только тогда, когда сообщение
UserMessage будет отправлено в шину
'command.bus'.
Пример
Давайте создадим две шины и два обработчика, каждый из которых привязан к своей шине:
framework:
messenger:
buses:
command.bus: ~
query.bus: ~
<?php
namespace App\MessageHandler;
use App\Message\UserMessage;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler(bus: 'command.bus')]
class CommandMessageHandler
{
public function __invoke(UserMessage $message): void
{
echo 'command: ' . $message->text;
}
}
?>
<?php
namespace App\MessageHandler;
use App\Message\UserMessage;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler(bus: 'query.bus')]
class QueryMessageHandler
{
public function __invoke(UserMessage $message): void
{
echo 'query: ' . $message->text;
}
}
?>
Теперь отправим сообщение в шину 'query.bus' из контроллера:
<?php
namespace App\Controller;
use App\Message\UserMessage;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/', name: 'article_index')]
public function index(MessageBusInterface $queryBus): Response
{
$queryBus->dispatch(new UserMessage('abcde'));
return new Response('done');
}
}
?>
Результат выполнения кода:
query: abcde
Смотрите также
-
атрибут
AsMessageHandler,
который помечает класс как обработчик сообщений -
класс
MessageBus,
который представляет шину сообщений -
метод
dispatch,
который отправляет сообщение в шину -
параметр
priority,
который задаёт приоритет обработчика