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

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

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

1. Создайте файл config/packages/messenger.yaml, если его еще нет.

2. В этом файле определите конфигурацию шины сообщений, задав ей любое имя, например, message_bus:

framework:
    messenger:
        buses:
            message_bus:
                default_middleware_chain: SymfonyComponentMessengerMiddlewareHandleMessageMiddleware

3. Далее определите алиас для созданной шины сообщений, используя параметр middleware_name_resolver:

framework:
    messenger:
        buses:
            message_bus:
                default_middleware_chain: SymfonyComponentMessengerMiddlewareHandleMessageMiddleware
        middleware_name_resolver:
            AppMessageBusMessageBusNameResolver

4. Создайте класс 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;
    }
}

5. Теперь у вас есть возможность использовать новую шину сообщений с алиасом 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.