在Symfony 4.2中按值动态获取服务

时间:2019-06-27 08:51:31

标签: php symfony service dependency-injection symfony-4.2

我需要在实现AbstractControllerInterface的控制器中调用“ Utils” Class方法中的按值使​​用服务。

我的项目中有一个具有某些映射的实体。 其中一些具有实用程序类。 其中一些实现了myInterface。

我有一个循环来检查这些映射字段中的每个映射字段,获取每个正确的utils类名称,检查其存在以及myInterface的实现。

在这种情况下,我想实例化该类(或将它们用作服务)并调用我的方法。

每个Util类可以具有不同的构造函数参数,而自动装配可以提供帮助。

我不能传递容器并使用容器的get方法,因为AbstractControllerInterface实现,并且不能仅仅使“新的$ 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 个答案:

没有答案