当前位置: 首页 > 知识库问答 >
问题:

在Symfony中选择具有依赖注入的实体管理器

越勇锐
2023-03-14

我在doctor.yaml中定义了两个不同的实体经理

entity_managers:
            EM1:
                naming_strategy: doctrine.orm.naming_strategy.underscore
                mappings:
                    App\EM1:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/BC1/Domain/Entity'
                        prefix: 'BC1\Domain\Entity'
                        alias:  App\EM1
            EM2:
                naming_strategy: doctrine.orm.naming_strategy.underscore
                mappings:
                    App\EM2:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/BC2/Domain/Entity'
                        prefix: 'BC2\Domain\Entity'
                        alias:  App\EM2

我在我的服务中注入了一个理念实体管理界面:

服务中心

    DoctrineRepository:
        class: BC\Infrastructure\Persistence\DoctrineRepository
        arguments:
            - "@Doctrine\\ORM\\EntityManagerInterface"

DoctrineRepository.php

    public function __construct(
        EntityManagerInterface $client
    ) {
        $this->entityManager = $client;
    }

我希望能够选择在使用DoctrineRepository时要使用的先前定义的实体管理器(EM1、EM2)。理想的情况是:

$this->entityManager->useEntityManager('EM2');

我是否需要注入另一个服务而不是Doctrine\ORM\EntityManager接口?我已调试实体管理器加载,发现它在生成缓存时自动分配第一个:

cache/dev/getDoctrineRepositoryService.php:

return $this->privates['DoctrineRepository'] = new BC\Infrastructure\Persistence\DoctrineRepository(($this->services['doctrine.orm.EM1_entity_manager'] ?? $this->load('getDoctrine_Orm_EM1EntityManagerService.php')));

任何帮助都将不胜感激,谢谢。

共有2个答案

魏彦
2023-03-14

由于有两个服务实现相同的接口,因此需要帮助Symfony的自动布线

如文件中所述:

您可以从TransformerInterface接口创建一个普通别名,然后从一个特殊字符串创建一个命名的自动配电别名,该字符串包含接口,后跟一个与您在进行注入时使用的变量名称相匹配的变量名称

就你而言

    # the ``App\EM2`` service will be
    # injected when an ``Doctrine\ORM\EntityManagerInterface``
    # type-hint for a ``$em2Manager`` argument is detected.
    Doctrine\ORM\EntityManagerInterface $em2Manager: '@App\EM2'

    # If the argument used for injection does not match, but the
    # type-hint still matches, the ``Doctrine\ORM\EntityManagerInterface``
    # service will be injected.
    Doctrine\ORM\EntityManagerInterface: '@App\EM1'
乐正浩博
2023-03-14

我想我找到了另一个解决办法。我没有注入EntityManagerInterface,而是注入了@Doctrine本身(它注入了一个Doctrine\Bundle\DoctrineBundle\Registry对象),从该对象可以生成一个$object-

 类似资料:
  • 我正在浏览与依赖项注入相关的Symfony 2文档,但找不到自动连线的参考。我发现一个捆绑包提供了一些这方面的功能,但它仍处于测试阶段,似乎与注释有关(如果我错了,请纠正我)。 我要寻找的是一个对象(比如服务容器),它可以通过setter注入在我的服务中注入依赖项。 例如,我将定义一个服务: 然后,我可以使用这个假设的服务容器在服务中注入依赖项,即使这个依赖项是在容器外部创建的: 是否有DI容器可

  • 在Synfony 3.3中,DI的新最佳实践 是使用普通构造函数依赖项注入(或控制器中的“操作”注入),而不是通过$this获取公共服务- 如官方留档所见 因此,无需指定服务,因为我们可以在类控制器中键入提示: 这似乎工作得很好,但如果我扩展了一个类并在构造函数中添加了更多参数呢??? 现在我得到一个循环引用错误: [Symfony\Component\DependencyInjection\Ex

  • 问题内容: 在我的NestJS应用程序中- 我有TypeScript类,这些类中已经注入了其他类和值。唯一的是,我要导入带有语句的TypeScript类,并使用DI系统注入它们。有什么方法可以删除导入语句并让DI系统处理它? 问题答案: TL; DR ->类参考 DI->类实例化 可以通过字符串标记进行匹配,但最好使用类引用。 封装形式 依赖项注入系统主要处理类的实例化。这很好,因为您不必关心要注

  • 有没有可能使控制器依赖于他们的服务,而不是通过使用服务容器,而是通过纯粹的构造函数依赖注入? 我希望以这种方式编写控制器: 不幸的是,正如我所看到的,Symfony ControllerResolver不通过ServiceContainer而是通过简单的调用创建新的控制器实例。

  • 我有以下实体: 我想为包含在

  • 问题内容: 我在数据访问层中将JPA-2.0与Hibernate一起使用。 为了进行审核日志记录,我通过在persistence.xml中配置以下属性来使用Hibernate的EmptyInterceptor: 凡 AuditLogInterceptor 扩展Hibernate的’ org.hibernate.EmptyInterceptor ‘。 我在数据访问层中使用JPA实体管理器来执行数据库