gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:27:51 24 4
gpt4 key购买 nike

我想在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com