Компонент Symfony DI - Как сделать некоторые сервисы общедоступными и доступными по имени класса интерфейса - PullRequest
0 голосов
/ 20 мая 2019

Использование DI в качестве автономного компонента в небольшой части кодовой базы. Я хочу сделать некоторые сервисы видимыми вне этой части и доступными как по имени класса интерфейса.

Как я знаю, я должен использовать контейнер дляэтот.Поэтому, когда старая часть кода (которая не может использовать DI) хочет использовать службу, реализация которой настраивается этой частью кода: она должна вызывать $container->get(MyInterface:class).

Проблема в том, что я получаю:

The "App\MyInterface" service or alias has been removed or inlined when the container was compiled. You should either make it public or stop using the container directly and use dependency injection instead.

Я не могу использовать DI в других частях кода.Поэтому я хочу сделать некоторые из моих услуг публичными.Это мой код:

services.yaml:

# ...
# autowire & autoconfigure: true
# catalogs included

App\MyInterface: '@my.configured.implementation'

my.configured.implementation:
    class: App\MyInterfaceImplementation

Строитель:

$containerBuilder = new ContainerBuilder();
$loader = new YamlFileLoader($containerBuilder, new FileLocator(__DIR__));
$loader->load('services.yaml');

//Make `MyInterface::class` public so
//$container->get(MyInterface::class) should work.
$containerBuilder->getDefinition(MyInterface::class)->setPublic(true);

$containerBuilder->compile(true);

Когда приходит определение, я получаю:

Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException: You have requested a non-existent service "App\MyInterface"

Как я могу заставить это работать?Или, может быть, есть лучший способ использовать один сервис этими двумя модулями?

...