2017-02-05 7 views
1

私は自分のプロジェクトにdoctrine ODMを使いたいと思っていました。私はクライアントごとに別々のデータベースを用意することを考えました。私は、私のAPIを通して、実行時にクライアントを管理できるようにしたい。私の質問は今です:Doctrine ODM実行時にデータベースを選択

私はdoctrine ODMをセットアップするときに私のparameters.ymlに自分のデータベース設定を設定する必要がありますが、実行時にデータベースを選択できるようにしたい。私は選択するデータベースを知るためにすべての私のフィクスチャコレクションとクライアントインデックスを持つ1つのメインデータベースを持っていますが、クライアント固有のものはそれらのクライアントデータベースにあります。各Documentクラスは、通常の状況のようにコレクションにリンクされますが、別のデータベースにリンクされます。

実行時にDocumentクラスのデータベースを選択する方法はありますか?

私はwww.myproject.com/client1/item/listに行きます。 私はdbclient1.Itemsコレクションのすべてのアイテムをリストします。もし私がwww.myproject.com/client2/item/listに行くならdbclient2.Itemsコレクションのすべてのアイテムをリストします。

私はここに到達したいものを明確にしたいと思っています...私はこれについて何かを見つけることができませんでしたが、私がこれについて質問をした最初の人なら、それは変だと思います...同じアイデアの権利を持つ私の前にいる人たちであったに違いない?

答えて

0

実行時にDocumentクラスのデータベースを選択する方法はありますか?

はい、データベースを変更する必要があるたびに$dm->getConfiguration()->setDefaultDb('some_db_name')を呼び出すことができますが、これは書き込みが始まると予期しない動作につながる可能性があります。

私の経験(マルチテナントアプリでは数年間の練習)に基づいて、最も防弾的な方法は、文脈ごとにDocumentManagerという別個のインスタンスを作成することです。あなたは1 DocumentManagerがあなたのパラメータで正常に設定されますが、直接使用することはありません持っていることによってそれを達成することができます - 代わりにあなたはそのインスタンスを管理するクラス、FE持っている必要があります:いくつかのデータベースから、このアプローチ文書に

use Doctrine\ODM\MongoDB\DocumentManager; 

class DocumentManagerFactory 
{ 
    /** 
    * DocumentManager created by Symfony. 
    * 
    * @var DocumentManager 
    */ 
    private $defaultDocumentManager; 

    /** 
    * All DocumentManagers created by Factory so far. 
    * 
    * @var DocumentManager[] 
    */ 
    private $instances = array(); 

    public function __construct(DocumentManager $dm) 
    { 
     $this->defaultDocumentManager = $dm; 
    } 

    public function createFor(Context $ctx) 
    { 
     $databaseName = $ctx->getDatabaseName(); 
     if (isset($this->instances[$databaseName])) { 
      return $this->instances[$databaseName]; 
     } 
     $configuration = clone $this->defaultDocumentManager->getConfiguration(); 
     $configuration->setDefaultDB($databaseName); 
     return $this->instances[$databaseName] = DocumentManager::create(
      $this->defaultDocumentManager->getConnection(), 
      $configuration, 
      $this->defaultDocumentManager->getEventManager() 
     ); 
    } 
} 

感謝を決してDocumentManagerで管理されている場合は、ODM構成とフレームワークアプローチで干渉する1つのクラスがあります(イベントサブスクライバなどはそれぞれDocumentManagerで同じです)。

関連する問題