我需要在从实现 AbstractControllerInterface 的控制器调用的“Utils”类方法中按值使用服务。
我的项目中有一个实体,它有一些映射。其中一些有一个 Utils 类。其中一些实现了 myInterface。
我有一个循环来检查每个映射字段,获取每个正确的 utils 类名称,检查它的存在和 myInterface 的实现。
在这种情况下,我想实例化该类(或将它们用作服务)并调用我的方法。
每个 Util 类都可以有不同的构造函数参数,我认为自动装配可以提供帮助。
我无法传递容器并使用容器 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);
对我糟糕的英语表示感谢和抱歉。
谢谢你。