Symfony 4.2 / Messenger - есть ли способ отправлять на подстановочные знаки только непревзойденные элементы? - PullRequest
0 голосов
/ 15 апреля 2019

Я использую компонент 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?

...