从这个评论:
我的问题不在于组件的创建。创建后不久,如果我访问 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);
}
}
希望它有所帮助,我在这里假设很多事情:)