Как добавить алиас на шину сообщений в Symfony?

В Symfony для добавления алиаса на шину сообщений используется конфигурационный файл config/packages/messenger.yaml. Если файл отсутствует, то его необходимо создать.

Опишем процесс добавления алиаса на шину сообщений по шагам:

  1. Создайте файл config/packages/messenger.yaml, если его еще нет.
  1. В этом файле определите конфигурацию шины сообщений, задав ей любое имя, например, message_bus:
framework:
    messenger:
        buses:
            message_bus:
                default_middleware_chain: SymfonyComponentMessengerMiddlewareHandleMessageMiddleware
  1. Далее определите алиас для созданной шины сообщений, используя параметр middleware_name_resolver:
framework:
    messenger:
        buses:
            message_bus:
                default_middleware_chain: SymfonyComponentMessengerMiddlewareHandleMessageMiddleware
        middleware_name_resolver:
            AppMessageBusMessageBusNameResolver
  1. Создайте класс MessageBusNameResolver в директории src/MessageBus:
namespace AppMessageBus;

use SymfonyComponentMessengerStampBusNameStamp;
use SymfonyComponentMessengerEnvelope;
use SymfonyComponentMessengerMiddlewareStackInterface;
use SymfonyComponentMessengerMiddlewareMiddlewareInterface;
use SymfonyComponentMessengerMiddlewareMiddlewareStackInterface;
use SymfonyComponentMessengerMiddlewareMiddlewareStackAwareInterface;

class MessageBusNameResolver implements MiddlewareInterface, MiddlewareStackAwareInterface
{
    private $stack;

    public function handle(Envelope $envelope, StackInterface $stack): Envelope
    {
        $envelope = $stack->next()->handle($envelope, $this->stack);

        if (null === $envelope->last(BusNameStamp::class)) {
            $envelope = $envelope->with(new BusNameStamp('message_bus'));
        }

        return $envelope;
    }

    public function setStack(MiddlewareStackInterface $stack): void
    {
        $this->stack = $stack;
    }
}
  1. Теперь у вас есть возможность использовать новую шину сообщений с алиасом message_bus:
// ...
use SymfonyComponentMessengerMessageBusInterface;

class MyController extends AbstractController
{
    private $messageBus;

    public function __construct(MessageBusInterface $messageBus)
    {
        $this->messageBus = $messageBus;
    }

    public function myAction()
    {
        // Отправка сообщения на шину сообщений с алиасом "message_bus"
        $this->messageBus->dispatch(new MyMessage());
    }
}

Теперь вы можете использовать созданную шину сообщений с алиасом message_bus для отправки и обработки сообщений в вашем приложении Symfony.