php - Symfony2 MongoDB 多连接错误

标签 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"

我在 MongoDB 中的 2 个不同的包中使用了 2 个数据库,nxtlog 和 nxtsurvey。 我最初遇到的问题是我在选项中添加的数据库名称没有被考虑在内,这导致使用数据库“默认”,这当然不存在。我也不想添加 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: ~

为了让它工作,我在每个文档注释中添加了数据库的名称:

/**
 * @MongoDB\Document(db="nxtlog")
 */
class ErrorLogs

这是一个临时解决方案,但由于我的计划是在我的其他项目中重用 bundle ,我不想浏览所有文档并设置数据库的名称。

==== 尝试 #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: ~

并得到以下错误:

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".

所以我发现连接和数据管理器不能有不同的名称。我不相信,所以我google了一下,有人遇到了类似的问题,答案是在doctrine_mongodb下添加以下内容:

default_commit_options: ~

但是这个解决方案对我不起作用,经过更多谷歌搜索,我发现编写包(或其中一部分)的人 jmikola 犯了一个错误,他说他修复了它,并且 default_commit_options 应该不是必需的配置选项。 (引用 https://github.com/doctrine/DoctrineMongoDBBundle/issues/222 )

在这一点上我需要一些帮助,因为这需要太多时间来解决。

谢谢

最佳答案

很久以前,我也尝试设置多个 Doctrine 连接,尽管当时我使用的是 Zend Framework(以及相应的 Doctrine 模块)。如果我没记错的话,您必须设置 all Doctrine 服务并添加新的命名空间(在您的情况下为 nxtlog_conn)。

我查看了source of the ZF2 DoctrineMongoODMModule它仍然是我内存中的样子:如果你想建立连接,你需要一个以相同命名空间为前缀的 Doctrine configuration service

从您的错误消息来看,这也适用于 Symfony bundle ,尽管我在 bundle 源代码中找不到负责的位置。

The service "doctrine_mongodb.odm.nxtlog_conn_connection" has a dependency on a non-existent service "doctrine_mongodb.odm.nxtlog_conn_configuration".

这基本上告诉你:我想要一个连接,但是等一下,我找不到对应的配置!

尝试查找如何为 orm_default 连接设置配置,并以同样的方式设置您的配置。如果您遇到另一个相同格式的错误,请寻找下一个所需的服务名称,然后冲洗并重复。

关于php - Symfony2 MongoDB 多连接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28811919/

相关文章:

php - Laravel, "before"在路由组中意味着什么?

php - 按数据库中的评级排序 - 将此 SQL 放在哪里? (PHP/MySQL)

javascript - 为客户取消 'One week trial' 的最佳惯例?

regex - MongoDB:哪个更快?正则表达式搜索字符串还是直接搜索数组?

php - 如何使用Twig的属性函数访问嵌套对象属性

php - 在 DQL 中加入

php - Symfony2 自定义表单类型 key 对

php - 神秘的 INSERT UPDATE 错误

c# - 在 MongoDB 中使用 MongoDBRef 引用多个外国文档

php - Symfony2 功能测试打印出重定向 html 并停止测试执行