Symfony 3.3中的多个实体管理器不能作为服务参数工作

Cas*_*ani 10 orm doctrine entitymanager symfony symfony-3.3

我已经配置了两个到数据库的连接.一个连接称为用户,另一个称为客户端.这是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
Run Code Online (Sandbox Code Playgroud)

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

# 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']
Run Code Online (Sandbox Code Playgroud)

但无论我做什么,我总是得到我在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
Run Code Online (Sandbox Code Playgroud)

即使我提供'@ 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
Run Code Online (Sandbox Code Playgroud)

即使我提供'@ doctrine.orm.client_entity_manager'作为服务参数,我也总是会得到用户实体管理器.

我在这做错了什么?

Đur*_*nić -1

因此,您定义了一个名为的服务DatabaseRepository,该服务有两种变体。在某一时刻它接收“客户端”实体管理器,在另一时刻它接收“用户”实体管理器?

我认为它总是返回“客户端”管理器,很可能是因为这是第一次为服务容器定义服务。之后在同一代码中定义什么并不重要.yml

现在,有一个很大的“为什么”反问句摆在你面前。为什么不定义两个服务类,每个服务类针对特定的经理?如果您确实必须这样做,则表明项目的其余代码中存在一些严重的设计问题。

另一个建议:为你的类命名时一定要更具描述性。实体管理器和存储库类当然对数据库做了一些事情。我发现以正确的方式命名类、属性、变量是工作中最具挑战性的部分之一,但它使我们的生活变得更轻松。

顺便提一句。避免将整个容器作为服务参数传递:

arguments: ['@service_container',
Run Code Online (Sandbox Code Playgroud)

因为它的资源太昂贵了。