gpt4 book ai didi

symfony - Symfony 3.3 中的多个实体管理器接缝不能用作服务参数

转载 作者:行者123 更新时间:2023-12-02 03:26:01 25 4
gpt4 key购买 nike

我已经配置了两个数据库连接。一个连接称为用户,另一个称为客户端。这是config.yml文件中的配置:

doctrine:
dbal:
default_connection: client
connections:
client:
driver: pdo_mysql
host: '%client_database_host%'
port: '%client_database_port%'
dbname: '%client_database_name%'
user: '%client_database_user%'
password: '%client_database_password%'
charset: UTF8
mapping_types:
enum: string
user:
driver: pdo_mysql
host: '%user_database_host%'
port: '%user_database_port%'
dbname: '%user_database_name%'
user: '%user_database_user%'
password: '%user_database_password%'
charset: UTF8
mapping_types:
enum: string

orm:
auto_generate_proxy_classes: '%kernel.debug%'
default_entity_manager: ~
entity_managers:
client:
naming_strategy: doctrine.orm.naming_strategy.underscore
mappings:
ProjectModelBundle: ~
connection: client
user:
naming_strategy: doctrine.orm.naming_strategy.underscore
mappings:
BaseModelBundle: ~
ProjectModelBundle: ~
connection: user

但无论如何,我总是得到第一个实体经理。这就是我在服务中使用实体管理器的方式:

# BASE
htec.project_model_bundle.repository.database.client_base:
class: Project\BaseModelBundle\Repository\Database\DatabaseRepository
arguments: ['@service_container', '@doctrine.orm.client_entity_manager', '@form.factory']

htec.project_model_bundle.repository.database.user_base:
class: Project\BaseModelBundle\Repository\Database\DatabaseRepository
arguments: ['@service_container', '@doctrine.orm.user_entity_manager', '@form.factory']

但无论我做什么,我总是会得到我在 orm->entity_managers 设置下定义的第一个实体管理器。例如,如果像这样配置 orm:

orm:
auto_generate_proxy_classes: '%kernel.debug%'
default_entity_manager: ~
entity_managers:
client:
naming_strategy: doctrine.orm.naming_strategy.underscore
mappings:
ProjectModelBundle: ~
connection: client
user:
naming_strategy: doctrine.orm.naming_strategy.underscore
mappings:
BaseModelBundle: ~
ProjectModelBundle: ~
connection: user

即使我提供“@doctrine.orm.user_entity_manager”作为服务参数,我也将始终获得客户端实体管理器。

如果我像这样配置 orm:

orm:
auto_generate_proxy_classes: '%kernel.debug%'
default_entity_manager: ~
entity_managers:
user:
naming_strategy: doctrine.orm.naming_strategy.underscore
mappings:
BaseModelBundle: ~
ProjectModelBundle: ~
connection: user
client:
naming_strategy: doctrine.orm.naming_strategy.underscore
mappings:
ProjectModelBundle: ~
connection: client

即使我提供“@doctrine.orm.client_entity_manager”作为服务参数,我也将始终获得用户实体管理器。

我在这里做错了什么?

最佳答案

最近我也遇到了类似的问题。 @dbrumann 的评论给了我解决这个问题的好线索。我使用了下一个方法:

  1. 如果您使用控制台命令debug:autowiring,您将看到有一个别名为doctrine的服务。

    Doctrine\Common\Persistence\ManagerRegistry alias to doctrine
  2. 您可以通过类型提示来访问目标类中的该服务,将服务类(或接口(interface))的名称作为参数放入目标类的构造函数中。

  3. 现在您可以访问目标类中服务的所有方法,通过使用方法 getManager() 您将获得任何管理器:

    use Doctrine\Common\Persistence\ManagerRegistry;

    $protected $managerRegistry;

    public function __construct(ManagerRegistry $managerRegistry)
    {
    $this->managerRegistry = $managerRegistry;
    }

    public function foo()
    {
    // asuming your managers names are default and second
    $firstManager = $this->managerRegistry->getManager('default');
    $secondManager = $this->managerRegistry->getManager('second');
    }

关于symfony - Symfony 3.3 中的多个实体管理器接缝不能用作服务参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47441870/

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