2012-01-05 11 views
0

私は2つの異なるコンテキストでブラウズできるsymfonyのWebサイトを持っています。私はアプリケーションではなくコンテキストを意味します(私はysfDimensionsPluginを使用します)。最初のコンテキストでは、データベースdb1にバインドされたsfGuardを使用してユーザーを認証します。 2番目のコンテキストでは、sfGuardを使用してユーザーを認証しますが、データベースdb2にバインドします。コンポーネントを接続に動的にバインドします

これらの2つの接続は、databases.ymlで標準のsfDoctrineDatabaseオブジェクトとして定義されています。 schema.ymlでは、sfGuardコンポーネントをdb1接続にバインドします。だから私のsfGuard基底クラスで、私はこれを持っている:

Doctrine_Manager::getInstance()->bindComponent('sfGuardUser', 'db1'); 

私は何をしようとすると、私は2番目のコンテキストにいる場合は、動的にDB2接続にsfGuardコンポーネントをバインドすることです。だから、グローバルpreExecute方法では、私がこれを行う:

Doctrine_Manager::getInstance()->bindComponent('sfGuardUser', 'db2'); 
Doctrine_Manager::getInstance()->bindComponent('sfGuardGroup', 'db2'); 

結合が行われますが、クエリが行われたとき、それはすぐに上書きされます。sfAutoloadはこれを呼び出して、基本クラスを含むsfGuardクラスをロード:

Doctrine_Manager::getInstance()->bindComponent('sfGuardUser', 'db1'); 

私はこう質問しています。それをどのように実装するのですか?

答えて

0

私は確信していますが、これを試すことができます。バインディング引数をファイル(ymlまたはjson)に格納します。バインディングは、ファイル内の引数(変数)に基づいて行われます。それに2が含まれている場合は、その両方をバインドして、ファイルに存在するものをバインドします。例えばのための

あなたはJSONファイルを持っている

{ 
    "context1": { 
     "db1": [ 
      "sfGuardUser" 
     ] 
    }, 
    "context2": { 
     "db2": [ 
      "sfGuardUser", 
      "sfGuardGroup" 
     ] 
    } 
} 

そしてapp.ymlファイル

all: 
    bind: context1 

にあなたはJSONファイル内のコンテキスト引数にapp.ymlファイルとバインドをお読みください。 app.ymlのバインド値がcontext1であるとします。次に、preExecute関数でdb1とsfGuardUserをバインドします。

あなたは申し訳ありません

sfConfig::set('app_bind',"context2"); 
+0

を使用して動的にapp.ymlの値を変更することができますが、私はあなたが何を意味するか理解していません。あなたはもっと明白かもしれませんか? – Gregoire

+0

@Gregoire遅く返事をおかけして申し訳ありません。私は答えを更新しました。 – Arasu

+0

私が言ったように、私のpreExecuteで行う "bindComponent()"呼び出しは、オートローダーによって上書きされるという問題があります。 – Gregoire

関連する問題