0

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

これらの2つの接続は、databases.ymlで標準のsfDoctrineDatabaseオブジェクトとして定義されています。schema.ymlで、sfGuardコンポーネントをdb1接続にバインドします。したがって、私のsfGuard基本クラスには、次のものがあります。

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

私がやろうとしているのは、2番目のコンテキストにいる場合、sfGuardコンポーネントをdb2接続に動的にバインドすることです。したがって、グローバルpreExecuteメソッドでは、次のようにします。

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

バインディングは作成されますが、クエリが実行されるとすぐに上書きされます。sfAutoloadは、基本クラスを含むsfGuardクラスをロードし、次のように呼び出します。

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

だから私は尋ねています:それを解決するためにそれをどのように実装しますか?

4

1 に答える 1

0

よくわかりませんが、これを試すことができます。バインド引数をファイル (yml または json) に保存します。バインドは、ファイル内の引数 (変数) に基づいて行われます。2 が含まれている場合は、両方をバインドします。それ以外の場合は、ファイルに存在するものをバインドします。

たとえば、jsonファイルがあります

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

そして app.yml で

all:
  bind: context1

app.yml を読み取り、json ファイルのコンテキスト引数にバインドします。app.yml のバインド値が context1 であるとします。次に、preExecute 関数で sfGuardUser を db1 にバインドします。

を使用して app.yml の値を動的に変更できます。

sfConfig::set('app_bind',"context2");
于 2012-01-05T15:07:45.313 に答える