symfony - 如何在多个实体管理器中使用 Symfony Autowiring

标签 symfony autowired entitymanager

我想在使用 2 个不同实体管理器的服务中使用 Autowiring 。如何实现这样的目标?

use Doctrine\ORM\EntityManager;
class TestService
{
    public function __construct(EntityManager $emA, EntityManager $emB)
    {
    }
}

我的 service.yml 文件使用如下配置:
    app.testservice:
        class: App\Services\TestService
        arguments:
            - "@doctrine.orm.default_entity_manager"
            - "@doctrine.orm.secondary_entity_manager"

最佳答案

已经发布了两个很好的答案,但我想添加第三个以及一些上下文,以帮助选择在给定情况下使用哪种方法。

emix 的答案非常简单,但有点脆弱,因为它依赖于注入(inject)正确服务的参数名称。这很好,但您不会从 IDE 获得任何帮助,有时可能会有点尴尬。答案可能应该使用 EntityManagerInterface 但这只是一个小问题。

DynlanKas 的回答需要在每个服务中添加一些代码来定位所需的管理器。没关系,但可能有点重复。另一方面,当您事先不确切知道需要哪个经理时,答案是完美的。它允许您根据一些动态信息选择经理。

第三个答案主要基于 Ron's Answer但稍微提炼了一点。

为每个实体管理器创建一个新类:

namespace App\EntityManager;
use Doctrine\ORM\Decorator\EntityManagerDecorator;
class AEntityManager extends EntityManagerDecorator {}
class BEntityManager extends EntityManagerDecorator {}

不要担心您正在扩展装饰器类。该类具有与“真实”实体管理器相同的接口(interface)和相同的功能。您只需要注入(inject)所需的管理器:
# config/services.yaml
App\EntityManager\AEntityManager:
    decorates: doctrine.orm.a_entity_manager

App\EntityManager\BEntityManager:
    decorates: doctrine.orm.b_entity_manager

这种方法需要为每个实体管理器创建一个新类以及几行配置,但允许您简单地键入所需的类:
public function __construct(AEntityManager $emA, BEntityManager $emB)
{
}

可以说,这是处理原始问题的最可靠和标准的方法。

关于symfony - 如何在多个实体管理器中使用 Symfony Autowiring ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59266372/

相关文章:

spring -/src/groovy中的动态 Autowiring

php - Symfony 4 - Autowiring 整个路径时如何使用服务标签

java - 不使用Spring获取EntityManager

php - Symfony2 安全登录在使用 pbkdf2 时不起作用

symfony - 如何将@request注入(inject)到服务中?

java - spring只能注册constructor beans?

java - 我们如何让 JPA EntityManager Flush 工作

java - em.Persist(book) 不会更新实体

symfony - 首先获得最短结果 Elasticsearch

php - Symfony 3.3 + Doctrine/MongoDB : Register custom mapping type