Получите услугу динамически по значению в 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);

Любая помощь приветствуется и сожалеет о моем плохом английском.

Спасибо.

0 ответов

Другие вопросы по тегам