このコメントから:
私の問題は、コンポーネントの作成ではありません。作成後すぐに 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);
}
}
それが役立つことを願っています、私はここで多くのことを想定しています:)