Сервис-псевдоним Symfony ServiceSubscriber - PullRequest
0 голосов
/ 10 октября 2019

В Symfony вы можете DI различные сервисы с тем же интерфейсом, как показано ниже:

public function __construct(ServiceInterface $serviceOne, ServiceInterface $serviceTwo)

Но как этого можно добиться таким же образом с ServiceSubscriberInterface?

public static function getSubscribedServices()
{
    return [
        'commandBus' => MessageBusInterface::class . ' $commandBus',
        'queryBus' => MessageBusInterface::class . '$queryBus',
    ];
}

Это ресурсы, которые я уже проверил: https://symfony.com/doc/current/service_container/service_subscribers_locators.html https://symfony.com/doc/current/messenger/multiple_buses.html

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Итак, после небольшого тестирования и с помощью @ Jakumi. Обнаружил, что ключ массива можно использовать для разрешения псевдонима службы, как указано ниже.

public static function getSubscribedServices()
{
    return [
       'commandBus' => MessageBusInterface::class,
       'queryBus' => MessageBusInterface::class,
    ];
}

В моем messenger.yaml:

framework:
  messenger:
    default_bus: 'command.bus'
    buses:
      command.bus:
        // stuff
      query.bus:
        // stuff
0 голосов
/ 12 октября 2019

Я сомневался, но, видимо, вы правы, и вы можете использовать интерфейс несколько раз, но нужно проделать некоторую работу , по сути, компонент мессенджера будет делать такие вещи, я думаю (Я не проверял подробно - обновление: я пытался найти это, но пока безуспешно ...).

Вот почему я предполагаю, что конструктор DI работает. ServiceSubscriberInterface :: getSubscribeedServices () используется аналогичным образом : в частности, ключ этого массива предполагается как псевдоним или имя класса или имя интерфейса или .. но, очевидно, это не дает вам хороший способ индексировать ваш массив сервисов, потому что он имеет значение.

Итак, я бы предположил, что простое удаление ключей вашего массива вполне может сделатьработа. В качестве альтернативы вы можете использовать фактическое имя службы MessageBusInterface s, запустив bin/console debug:container MessageBusInterface, который, как мы надеемся, вернет список псевдонимов служб, предоставляющих этот интерфейс ... или, возможно, вам придется просмотреть полный список ...

( update : как Снек правильно указал в чате, значение должно быть FQCN, что приводит к моему предположению, что ключ должен быть interface + varname, а значения - только интерфейс)

Для дальнейшего использования ServiceSubscriberInterface вам все еще нужно получить указатель службы в вашем классе (как подсказано в комментарии ), чтобы затем иметь возможность обслуживать службы. Тем не менее, мне интересно, если бы компонент мессенджера не предоставил подобный метод получения определенной шины по имени ...

...