Использовать транспорт по умолчанию (пропустить amqp) для Symfony Messenger - PullRequest
2 голосов
/ 30 апреля 2019

В messenger.yaml я отправляю свои сообщения на amqp соответственно

routing:
  # Route your messages to the transports
  'App\Message\SendNewsletterMessage': amqp

Но в некоторых средах, где у меня не установлен RabbitMQ, я хочу отправлять сообщения напрямую. Я не хочу просто закомментировать строку, потому что код развернут в нескольких местах. Вместо этого я хочу установить транспорт как внутренний вызов (как если бы он был закомментирован), но я не могу понять, как называется этот транспорт по умолчанию.

routing:
  # Route your messages to the transports
  'App\Message\SendNewsletterMessage':  '%env(MESSAGE_TRANSPORT)%' # amqp or...

Тогда моя переменная окружения может быть либо amqp, либо прямой. Какой транспорт нужно использовать для прямого звонка?

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Symfony 4.3 обрабатывает это, «прямой» транспорт называется sync:

# config/packages/messenger.yaml
framework:
    messenger:
        transports:
            async: '%env(MESSENGER_TRANSPORT_DSN)%'
        routing:
            'App\Message\SmsNotification': async
            'App\Message\OtherMessage': async


# .env
# by default, handle this sync
MESSENGER_TRANSPORT_DSN=sync://

https://github.com/symfony/symfony/pull/30759

1 голос
/ 30 апреля 2019

Похоже, что это невозможно, так как прямые сообщения не являются транспортом. В качестве обходного пути вы можете переписать свою конфигурацию:

# config/packages/dev/messenger.yaml
framework:
    messenger:
        routing: []
# config/packages/prod/messenger.yaml
framework:
    messenger:
        'App\Message\SendNewsletterMessage': amqp
# config/packages/messenger.yaml
framework:
    messenger:
        transports:
            amqp: '%env(MESSENGER_TRANSPORT_DSN)%'

Если вы хотите настроить транспорт для одной среды, вы можете украсить messenger.senders_locator:

# config/services.yaml
services:
    App\DirectSendersLocator:
        decorates: messenger.senders_locator
        arguments:
            - '@App\DirectSendersLocator.inner'
            - '%env(bool:DIRECT_TRANSPORT)%'
namespace App;

use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Transport\Sender\SendersLocatorInterface;

class DirectSendersLocator implements SendersLocatorInterface
{
    /**
     * @var SendersLocatorInterface
     */
    private $decorated;

    /**
     * @var bool
     */
    private $direct;

    public function __construct(SendersLocatorInterface $decorated, bool $direct)
    {
        $this->decorated = $decorated;
        $this->direct = $direct;
    }

    public function getSenders(Envelope $envelope, ?bool &$handle = false): iterable
    {
        if ($this->direct) {
            $handle = true;

            return [];
        }

        $this->decorated->getSenders($envelope, $handle);
    }
}
...