我想在运行时使用Yii连接到第二个数据库。用户登录后,数据库名称将来自数据库表。
我在教程中看到我应该这样做:
$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”
我做错了什么?
答案 0 :(得分:3)
以下适用于我:
Yii::app()->mongodb->setActive(false);
Yii::app()->mongodb->setServer('mongodb://localhost:27017');
Yii::app()->mongodb->setDb('db1');
Yii::app()->mongodb->setActive(true);
答案 1 :(得分: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
答案 2 :(得分:0)
来自此评论:
我的问题不在于组件的创建。不久之后 创建,如果我访问Yii :: app() - > db2它的工作,但当我尝试 通过另一个模型或控制器访问我得到错误
我认为您只在某处设置此组件,然后向不同的控制器发出后续请求。
您需要在每个请求上放置代码,它被称为EVERYTIME。这就是PHP的工作方式,没有“全局应用程序状态”
默认情况下,Yii自带的protected/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);
}
}
希望它有所帮助,我在这里假设很多东西:)