3

実行時に Yii を使用して 2 番目のデータベースに接続したいと考えています。データベース名は、ユーザーがログインした後のデータベース テーブルから取得されます。

私はこれを行う必要があるチュートリアルで見ました:

$db2 = Yii::createComponent(array(
    'class' => 'EMongoClient',
    'server' => 'mongodb://127.0.0.1:27017',
    'db' => $emp['database']
));

Yii::app()->setComponent('db2',$db2);

しかし、私のコントローラでは、アクセスYii::app()->db2するとエラーが発生します:

プロパティ「CWebApplication.db2」が定義されていません

私は何を間違っていますか?

4

3 に答える 3

1

更新: 代わりに、インスタンスを試して、構成を渡します:

Yii::app()->setComponent( 'db2', array(
                                      'class' => 'EMongoClient',
                                      'server' => 'mongodb://127.0.0.1:27017',
                                      'db' => $emp['database']
                                  )
);

または、次paramsのような構成で特別なインデックスを作成することもできます。

  ...
  'params' => array(
         'db2' => null,
     ),

そして用途はYii::app()->params['db2'] = $db2

于 2013-10-17T13:54:54.257 に答える
0

このコメントから:

私の問題は、コンポーネントの作成ではありません。作成後すぐに Yii::app()->db2 にアクセスすると動作しますが、別のモデルまたはコントローラー経由でアクセスしようとするとエラーが発生します

このコンポーネントをどこかで一度だけ設定してから、別のコントローラーに後続のリクエストを行っていると思います。

すべてのリクエストで、毎回呼び出される場所にコードを配置する必要があります。それがPHPの仕組みであり、「グローバルアプリケーション状態」はありません

デフォルトでは、Yiiprotected/components/controller.phpにはアプリの残りの部分のベース コントローラが付属しています。

私の提案はinit()、そのコントローラーのメソッドにコードを配置して、常に呼び出されるようにすることです。

ユーザーがログインすると、データベース名はテーブルから取得されると述べたので、他のリクエストでアクセスできるようにするには、その値をセッションに保存する必要があります。

<?php

// After login in
Yii::app()->user->setState('db_name', $db_name);

// in protected/components/controller.php
public function init()
{
    if (!Yii::app()->user->isGuest) {
        $db2 = Yii::createComponent(array(
            'class' => 'EMongoClient',
            'server' => 'mongodb://127.0.0.1:27017',
            'db' => Yii::app()->user->getState('db_name')
        ));

        Yii::app()->setComponent('db2',$db2);
    }
}

それが役立つことを願っています、私はここで多くのことを想定しています:)

于 2013-10-18T02:09:51.047 に答える