PHP Yii:运行时数据库连接

3
我希望在运行时使用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”未定义。

我做错了什么?

3个回答

3
以下是我使用的方法:
Yii::app()->mongodb->setActive(false);
Yii::app()->mongodb->setServer('mongodb://localhost:27017');
Yii::app()->mongodb->setDb('db1');
Yii::app()->mongodb->setActive(true);

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


当我尝试这样做时,我会得到以下错误:CModule::setComponent()缺少第二个参数。 - Leonardo Delfino
我的问题不在于创建组件。在创建后,如果我访问 Yii::app()->db2,它可以工作,但是当我尝试通过另一个模型或控制器访问时,就会出现错误。 - Leonardo Delfino
好的,尝试使用Yii::app()->setComponents( array('db2'=>$db2))(注意有"s")。或者尝试Yii::app()->setComponent('db2',<配置数组>)。 - CreatoR
有趣。另一个想法:在主配置中保留名称db2并尝试更改它的实例。如果不起作用,那么您可以在“params”中创建特殊键并更改它...请尝试。 - CreatoR
当我尝试访问Yii::app()->params['db2']时,它返回null。我正在尝试更改模块内的参数,您知道Yii在这方面是否有任何限制吗? - Leonardo Delfino
据我理解,在 Yii::app()-> 模块中是本地模块的环境。因此,在模块内部,您可以通过 ->setComponent('db2',...) 创建组件 - 它会在该模块中创建名为 db2 的组件。然后,我认为,您可以通过 Yii::app()->getModule($moduleName)->db2 从主应用程序访问它。试试看吧! - CreatoR

0
从这个评论开始:
我的问题不在于组件的创建。在创建后不久,如果我访问Yii::app()->db2,它就能正常工作,但是当我尝试通过另一个模型或控制器访问时,就会出现错误。
我认为你只在某个地方设置了这个组件一次,然后对不同的控制器进行后续请求。
你需要将代码放在每次请求时都被调用的地方。这就是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);
    }
}

希望这有所帮助,我在这里做了很多假设 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接