6

Symfony2 で MongoDB をセットアップする際に問題があります。

仕様:

"Symfony": "2.6.*"
"doctrine/mongodb-odm": "1.0.*@dev",
"doctrine/mongodb-odm-bundle": "3.0.*@dev"

MongoDB の 2 つの異なるバンドル nxtlog と nxtsurvey で使用される 2 つのデータベースがあります。私が抱えていた最初の問題は、オプションに追加したデータベース名が考慮されていなかったため、データベースの「デフォルト」が使用され、もちろん存在しませんでした。また、両方の接続が非コア バンドルで使用されるため、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

これは一時的な解決策ですが、私の計画は他のプロジェクトでバンドルを再利用することであるため、すべてのドキュメントを調べてデータベースの名前を設定する必要はありません。

==== 試行 #2 ====

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

そのため、接続とデータマネージャーに異なる名前を付けることはできないことがわかりました。私はそれを信じていなかったので、私はそれをグーグルで検索しました.誰かが同様の問題を抱えていました.答えはdoctrine_mongodbの下に以下を追加することでした:

default_commit_options: ~

しかし、この解決策は私にはうまくいきませんでした。さらにグーグルで調べたところ、バンドル (またはその一部) を作成した jmikola が間違いを犯したことがわかりました。彼はそれを修正したと言い、default_commit_options は必要な構成オプション。(参照https://github.com/doctrine/DoctrineMongoDBBundle/issues/222 )

この時点で、解決に時間がかかりすぎるため、助けが必要です。

ありがとう

4

2 に答える 2

1

かなり前に、Zend Framework (およびそれぞれの Doctrine モジュール) を使用していましたが、複数の Doctrine 接続もセットアップしようとしました。私の記憶が正しければ、新しい名前空間を追加してすべてのDoctrine サービスをセットアップする必要があります (あなたの場合はnxtlog_conn)。

ZF2 DoctrineMongoODMModuleのソースを確認しましたが、今でも覚えています。接続が必要なconfiguration service場合は、同じ名前空間のプレフィックスが付いた Doctrine が必要です。

あなたのエラー メッセージから判断すると、これは Symfony バンドルにも当てはまりますが、バンドルのソース コードで責任ある場所が見つかりませんでした。

サービス"doctrine_mongodb.odm.nxtlog_conn_connection"は、存在しないサービスに依存しています"doctrine_mongodb.odm.nxtlog_conn_configuration"

これは基本的に次のことを示しています。接続が必要ですが、ちょっと待ってください。対応する構成が見つかりません。

接続の構成がどのようにセットアップされているかを見つけて、orm_default同様に構成をセットアップしてください。同じ形式の別のエラーが発生した場合は、次に必要なサービス名を探してから、すすぎを繰り返します。

于 2015-03-06T16:18:56.460 に答える
1

よくわかりませんが、お役に立てば幸いです。ここにGoogleグループからのリンク 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: ~
于 2015-03-07T15:27:32.337 に答える