0

我需要在从实现 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);

对我糟糕的英语表示感谢和抱歉。

谢谢你。

4

0 回答 0