Я использую компонент Messenger в Symfony 4.2 и множественную маршрутизацию для разных видов использования (обработчик SMS, обработчик почты, другое использование), и я хотел бы, чтобы этот подстановочный знак в маршрутизации перехватывал только сообщения, которые не совпадают с другими маршрутами.
Вот мой мессенджер конфигурации
# config/packages/messenger.yaml
framework:
messenger:
transports:
# DataSource for multiple transport
amqp_mailer: '%env(MESSENGER_TRANSPORT_DSN_MAILER)%'
amqp_sms: '%env(MESSENGER_TRANSPORT_DSN_SMS)%'
amqp: '%env(MESSENGER_TRANSPORT_DSN)%'
routing:
'App\Message\MailNotification': amqp_mailer
'App\Message\SmsNotification': amqp_sms
# All unmatched to global ?
'*': amqp
#.env
###> symfony/messenger ###
MESSENGER_TRANSPORT_DSN=amqp://guest:guest@localhost:5672/%2f/messages
MESSENGER_TRANSPORT_DSN_MAILER=amqp://guest:guest@localhost:5672/%2f/mails
MESSENGER_TRANSPORT_DSN_SMS=amqp://guest:guest@localhost:5672/%2f/sms
###< symfony/messenger ###
Я создаю три типа сообщений и три обработчика с одинаковой логикой для целей тестирования
Обработчик:
<?php
namespace App\Message\Handler;
use App\Message\SmsNotification;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
class GlobalHandler implements MessageHandlerInterface
{
public function __invoke(SmsNotification $message)
{
var_dump($message);
}
}
То же самое для SmsHandler и MailerHandler
Сообщения:
<?php
namespace App\Message;
class GlobalNotification {
private $content;
public function __construct(string $content)
{
$this->content = $content;
}
/**
* @return string
*/
public function getContent(): string
{
return $this->content;
}
}
Одинаковая логика для SmsNotification и MailNotification
И я отправляю 3 события в действии контроллера:
/**
* @Route("/messenger", name="app_front_main_messenger")
* @param TraceableMessageBus|MessageBusInterface $bus
* @return Response
* @throws \Throwable
*/
public function messenger(MessageBusInterface $bus)
{
$bus->dispatch(new MailNotification('Mail '.date('H:i:s')));
$bus->dispatch(new SmsNotification('Sms '.date('H:i:s')));
$bus->dispatch(new GlobalNotification('Global '.date('H:i:s')));
return $this->render('front/main/homepage.html.twig', []);
}
Ожидаемое:
SmsNotification только поймать SmsHandler,
MailNotification только поймать MailerHandler,
GlobalNotification только поймать GlobalHandler
Фактические результаты:
GlobalHandler перехватить все сообщения
На панели инструментов RabbitMQ я вижу, что в очередь сообщений поступило три сообщения:
https://i.ibb.co/nf4g9Q9/Capture-d-e-cran-2019-04-15-a-11-09-37.png
(Извините, не хватает репутации, чтобы поставить изображение напрямую)
Как я могу сказать Symfony не отправлять SmsNotification и MailNotification на маршрутизацию '*'?
Или я должен проверить в GlobalHandler, чтобы не обрабатывать полученные SmsNotification или MailNotification?