Мне нужно использовать службу по значению в методе класса «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);
Мы ценим любую помощь и извиняюсь за мой плохой английский.
Спасибо.