nic*_*974 6 php mongodb symfony doctrine-orm doctrine-mongodb
我在Symfony2中设置MongoDB时遇到问题.
眼镜:
"Symfony": "2.6.*"
"doctrine/mongodb-odm": "1.0.*@dev",
"doctrine/mongodb-odm-bundle": "3.0.*@dev"
Run Code Online (Sandbox Code Playgroud)
我在MongoDB中有2个不同的包,nxtlog和nxtsurvey使用了2个数据库.我遇到的原始问题是我没有考虑我在选项中添加的数据库名称,这导致使用数据库'default',这当然不存在.我也不想添加default_connection和default_manager,甚至也不想添加default_database,因为两个连接都用在非核心包中.
====尝试#1 ====
这是我原来的配置:
doctrine_mongodb:
connections:
nxtlog:
server: "%nxtlog_database_server%"
options:
username: "%nxtlog_database_username%"
password: "%nxtlog_database_password%"
db: "%nxtlog_database_name%"
nxtsurvey:
server: "%nxtsurvey_database_server%"
options:
username: "%nxtsurvey_database_username%"
password: "%nxtsurvey_database_password%"
db: "%nxtsurvey_database_name%"
document_managers:
nxtlog:
mappings:
NxtLogBundle: ~
nxtsurvey:
mappings:
NxtVibeSurveyBundle: ~
Run Code Online (Sandbox Code Playgroud)
为了使其工作,我在每个文档注释中添加了db的名称:
/**
* @MongoDB\Document(db="nxtlog")
*/
class ErrorLogs
Run Code Online (Sandbox Code Playgroud)
这是一个临时解决方案,但由于我的计划是在我的其他项目中重用捆绑包,我不希望必须遍历所有文档并设置数据库的名称.
====尝试#2 ====
我的第二次尝试是严格遵循文档,因此我尝试了以下方法:
doctrine_mongodb:
connections:
nxtlog_conn:
server: "%nxtlog_database_server%"
options:
username: "%nxtlog_database_username%"
password: "%nxtlog_database_password%"
connect: true
db: "%nxtlog_database_name%"
nxtsurvey_conn:
server: "%nxtsurvey_database_server%"
options:
username: "%nxtsurvey_database_username%"
password: "%nxtsurvey_database_password%"
connect: true
db: "%nxtsurvey_database_name%"
document_managers:
nxtlog_dm:
connection: nxtlog_conn
mappings:
NxtLogBundle: ~
nxtsurvey_dm:
connection: nxtsurvey_conn
mappings:
NxtVibeSurveyBundle: ~
Run Code Online (Sandbox Code Playgroud)
并得到以下错误:
ServiceNotFoundException in CheckExceptionOnInvalidReferenceBehaviorPass.php line 58:
The service "doctrine_mongodb.odm.nxtlog_conn_connection" has a dependency on a non-existent service "doctrine_mongodb.odm.nxtlog_conn_configuration".
Run Code Online (Sandbox Code Playgroud)
所以我发现我的连接和数据管理器名称不同.我不相信,所以我用Google搜索,有人有类似的问题,答案是在doctrine_mongodb下添加以下内容:
default_commit_options: ~
Run Code Online (Sandbox Code Playgroud)
但这个解决方案对我来说不起作用,经过更多的谷歌搜索,我发现jmikola,编写捆绑(或其中的一部分)的人犯了一个错误,他说他修好了,而且default_commit_options不应该是必需的配置选项.(参考https://github.com/doctrine/DoctrineMongoDBBundle/issues/222)
在这一点上,我需要一些帮助,因为这需要花费太多时间来解决.
谢谢
不久前,我也尝试设置多个 Doctrine 连接,尽管当时我使用 Zend Framework(以及相应的 Doctrine 模块)。如果我没记错的话,您必须使用添加的新命名空间来设置所有nxtlog_connDoctrine 服务(在您的情况下)。
我检查了ZF2 DoctrineMongoODMModule 的来源,它仍然是我记忆中的样子:如果你想建立连接,你需要一个configuration service带有相同命名空间前缀的 Doctrine。
从您的错误消息来看,这也适用于 Symfony 捆绑包,尽管我无法在捆绑包源代码中找到负责的位置。
该服务
"doctrine_mongodb.odm.nxtlog_conn_connection"依赖于一个不存在的服务"doctrine_mongodb.odm.nxtlog_conn_configuration"。
这基本上告诉你:我想要一个连接,但是等一下,我找不到相应的配置!
尝试了解如何设置连接的配置orm_default并同样设置您的配置。如果您遇到相同格式的另一个错误,请搜索下一个所需的服务名称,然后冲洗并重复。