Выберите реализацию интерфейса на основе параметра в конфигурации Symfony - PullRequest
0 голосов
/ 01 мая 2019

Предположим, у меня есть интерфейс ThingInterface и две реализации Thing и MockThing.Теперь, предполагая, что я использую внедрение зависимостей, и я запрограммирован на ThingInterface, тогда в Symfony я могу сказать ему, какую реализацию использовать, следующим образом:

services:
    ...
    ThingInterface: '@Thing'
    ...

Можно ли выбрать и использовать реализацию на основепараметр?Например:

parameters:
    useMock: 'true'

services:
    ...
    # ThingInterface maps to ThingMock or Thing based on useMock parameter
    ThingInterface: '@ThingMock'
    ...

Я использую symfony 3.4 .

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

Я нашел this , который приводит этот пример:

services:
    AppBundle\Mailer:
        arguments: ["@=container.hasParameter('some_param') ? parameter('some_param') : 'default_value'"]

Но мне не удалось заставить его работать для сопоставления интерфейсов с реализациями:

parameters:
    useMock: 'true'

services:
    ...
    # ThingInterface maps to ThingMock or Thing based on useMock parameter
    ThingInterface: '@ThingMock'
    ThingInterface: ["@=container.getParameter('useMock') ? service('ThingMock') : service('Thing')"]
    ...

1 Ответ

0 голосов
/ 22 июля 2019

По какой-то неизвестной причине сокращение от псевдонима / переназначения строки, по-видимому, вообще не работает с symfony.

Вы можете попробовать это:

Namespace\ClassA: ~
Namespace\ClassB: ~
Namespace\MyInterface:
    class: '%my_interface.class%'

Однако, вы, вероятно, получите два экземпляра класса (две службы). К сожалению, псевдоним не работает и не будет импортироваться.

Единственные другие опции кажутся некрасивыми и в основном теряют автопроводку, т.е. привязку везде.

К сожалению, это единственный способ сделать это, так как Symfony не поддерживает то, что вы просите.

Если вы хотите сделать это, вы должны реализовать это как расширение фреймворка или использовать другой фреймворк. Есть куча проблем с github и отклоненных запросов на получение, подтверждающих это.

...