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)
因为它的资源太昂贵了。
| 归档时间: |
|
| 查看次数: |
547 次 |
| 最近记录: |