Получите услугу динамически по значению в Symfony 4.2
Мне нужно использовать службу по значению в методе класса "Utils", вызываемом из контроллера, который реализует AbstractControllerInterface.
У меня есть объект в моем проекте с некоторыми сопоставлениями. У некоторых из них есть класс Utils. Некоторые из них реализуют myInterface.
У меня есть цикл для проверки каждого из этих полей сопоставления, получения каждого правильного имени класса utils, проверки его существования и реализации myInterface.
В этом случае я хочу создать экземпляр этого класса (или использовать их как службу) и вызвать свой метод.
Каждый класс Util может иметь разные параметры конструктора, и я думаю, что Autowiring может помочь.
Я не могу передать контейнер и использовать метод get контейнера, потому что реализация AbstractControllerInterface и не могу просто создать "new $myClassName", потому что я не знаю, каким может быть определение каждой конструкции в каждом классе Utils.
мое определение услуги:
App\Utils\MyUtilsClass:
class: App\Utils\MyUtils
public: true
arguments:
- '@doctrine.orm.entity_manager'
- '@App\Helper\MyHelper'
часть моего кода:
# src\Utils\MyUtilsClass.php
namespace App\Utils
use Doctrine\ORM\EntityManagerInterface;
class MyUtilsClass{
protected $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
# $name = 'App\\Utils\\MyOtherUtilsClass'
public function myMethod($name)
{
$containerBuilder = new ContainerBuilder();
$fileLocator = new FileLocator(__DIR__ . '/../../config');
$loader = new YamlFileLoader($containerBuilder, $fileLocator);
$loader->load('services.yaml');
$containerBuilder->compile();
$utils = $containerBuilder->get($name);
Это вызывает у меня сообщение "служба или псевдоним были удалены или встроены при компиляции контейнера. Вы должны либо сделать его общедоступным, либо прекратить использование контейнера напрямую и вместо этого использовать внедрение зависимостей".
Изменить: попытка сделать его общедоступным выдает несуществующее исключение службы witdDoctrine\ORM\EntityManagerInterface в моем контейнере
public function myMethod($name)
{
....
$containerBuilder->getDefinition($claseUtils)->setPublic(true);
$utils = $containerBuilder->get($name);
Любая помощь приветствуется и сожалеет о моем плохом английском.
Спасибо.