Использование 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"
Как я могу заставить это работать?Или, может быть, есть лучший способ использовать один сервис этими двумя модулями?