2015-03-02 57 views
6

我有一個在Symfony2中設置MongoDB的問題。Symfony2 MongoDB多個連接錯誤

規格:

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

我在2個不同的束,nxtlog和nxtsurvey,MongoDB中使用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: ~ 

爲了使其工作,我加名每個文檔中的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: ~ 

,並獲得以下錯誤:

​​

所以我想通了,我不能有不同的名稱nections和數據管理器。我不相信,所以我GOOGLE了它,有人也有類似的問題,答案是添加下doctrine_mongodb如下:

default_commit_options: ~ 

但是這種解決方案並沒有爲我工作,而更多的谷歌搜索後,我發現jmikola,編寫包(或部分包)的人犯了一個錯誤,他說他修復了它,並且default_commit_options不應該是必需的配置選項。 (參考https://github.com/doctrine/DoctrineMongoDBBundle/issues/222

在這一點上我需要一些幫助,因爲這需要太多的時間來解決。

由於

回答

1

前一段時間我試圖設置多個學說連接,過於,雖然我使用Zend框架(和相應的學說模塊)的時間。如果我沒有記錯,你必須設置所有主義服務與新的命名空間添加(在你的情況下nxtlog_conn)。

我檢查了source of the ZF2 DoctrineMongoODMModule,我仍然記得它:如果你想要連接,你需要一個前綴爲相同命名空間的Doctrine configuration service

從您的錯誤消息來看,這也適用於Symfony包,儘管我無法在包源代碼中找到負責任的位置。

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

這基本上告訴你:我想要一個連接,但是等一下,我找不到相應的配置!

嘗試查找如何爲orm_default連接設置配置,並像明智地設置您的配置。如果遇到另一種相同格式的錯誤,請搜索下一個所需的服務名稱,然後沖洗並重復。

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: ~ 
+0

這正是我以前嘗試過,但我不希望默認參數的鏈接,我的情況下,它是完全無用的。爲什麼我會使用默認數據庫或連接,如果我有2個使用2個不同數據庫的包,因爲這兩個包都有完全不同的邏輯,並且不相互依賴。 – nicom974 2015-03-08 04:47:17

+0

是的,我明白你不想要一個默認參數,但你必須知道,默認並不意味着odm會自動使用它。你是誰選擇你使用的連接。 – 2015-03-09 09:00:40

+0

好吧,它實際上確實因爲某種原因一直選擇默認的。到目前爲止,我發現的唯一方法是在註釋中添加db名稱,這對我的用例來說不是一個好的解決方案。我xdebugged它,並看到從連接選項的數據庫實際上正在採取,但沒有在最後使用。我還沒有弄清楚爲什麼。 – nicom974 2015-03-09 14:10:39