在您引用的示例中,dbadvert 是为自定义活动记录类 RActiveRecord 设置的,而不是为 Web 应用程序设置的。
如果你想像Yii::app()->dbadvert 一样使用它,你需要像这样在config.php 的components 部分设置它
'dbadvert' => array(
'class' => 'CDbConnection'
*params here*
),
UPD
您可以为 CDbConnection 创建一个包装器组件,它将以您想要的任何方式更改连接字符串并作为 webapp 组件放入。
<?php
class CMultiuserDatabaseConnection extends CApplicationComponent {
public function __call($name, $params) {
$db = $this->db;
return call_user_func_array(($db, $name), $params);
}
public $dbConnectionClass = 'CDbConnection';
public $connections = null;
public $defaultConfiguration = null;
public function getDatabaseConfiguration($user) {
if (!$this->connections) { return array(); }
return array_key_exists($user, $this->connections) ? $this->connections[$user] : $this->defaultConfiguration;
}
public function getDb() {
$user = Yii::app()->user;
if ($user->isGuest) { return false; }
$username = $user->name;
$config = $this->getDatabaseConfiguration($username);
if (!$config) { return false; }
$dsn = array_key_exists('dsn', $config) ? $config['dsn'] : null;
if (!$dsn) { return false; }
$user = array_key_exists('user', $config) ? $config['user'] : null;
$password = array_key_exists('password', $config) ? $config['password'] : null;
$result = new $this->dbConnectionClass($dsn, $user, $password);
return $result;
}
}
这是一个粗略的组件示例,您可以将其设置为“db”组件,然后您将获得“连接”选项,以这种方式存储每个用户的配置:
'components' => array(
...
'db' => array(
'class' => "CMultiuserDatabaseConnection",
'connections' => array(
"first-user-name" => array(
// just another db configuration here, for user-one
),
"second-user-name" => array(
// just another db configuration herer, for user two
),
...
),
'defaultConfiguration' => array(
/*
* here goes configuration for all other user, that were not specified
* in connections.
*/
),
),
...
),