Получить сервис динамически по значению в Symfony 4.2 - PullRequest
0 голосов
/ 27 июня 2019

Мне нужно использовать службу по значению в методе класса «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);

Мы ценим любую помощь и извиняюсь за мой плохой английский.

Спасибо.

...