Symfony2 MongoDB多个连接错误

时间:2015-03-02 14:13:45

标签: 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',这当然不存在。我也不想添加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: ~

为了使其工作,我在每个文档注释中添加了db的名称:

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

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

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

此时我需要一些帮助,因为这需要花费太多时间来解决。

由于

2 个答案:

答案 0 :(得分:1)

很久以前我也尝试设置多个Doctrine连接,虽然我当时使用了Zend Framework(和各自的Doctrine模块)。如果我没记错的话,您必须设置所有 Doctrine服务,并添加新的命名空间(在您的情况下为nxtlog_conn)。

我检查了source of the ZF2 DoctrineMongoODMModule,我仍然记得它:如果你想要连接,你需要一个以相同命名空间为前缀的Doctrine configuration service

根据您的错误消息判断,这也适用于Symfony捆绑包,尽管我无法在捆绑包源代码中找到负责的位置。

  

服务"doctrine_mongodb.odm.nxtlog_conn_connection"依赖于不存在的服务"doctrine_mongodb.odm.nxtlog_conn_configuration"

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

尝试查找如何为orm_default连接设置配置,并明智地设置配置。如果您遇到相同格式的其他错误,请搜索下一个所需的服务名称,然后进行冲洗并重复。

答案 1 :(得分:1)

哼哼不确定,但希望它会有所帮助。这是谷歌集团的一个链接 https://groups.google.com/d/msg/doctrine-user/6YCVAZ4h4nA/YrZNfSopmNUJ

doctrine_mongodb:
    default_database: "%nxtlog_database_name%"
    default_connection: nxtlog_conn
    default_document_manager: nxtlog_conn
    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_conn:
            connection: nxtlog_conn
            mappings:
                NxtLogBundle: ~
        nxtsurvey_conn:
            connection: nxtsurvey_conn
            mappings:
                 NxtVibeSurveyBundle: ~