我尝试更改数据库连接,具体取决于谁尝试登录我的页面。
我需要的是一种保存正确的数据库名称的方法,以便我的所有控制器都可以访问它。
使用会话会有效,但我怀疑它的安全和/或良好做法。 如果我可以从我的AccountsController在AppController中设置一个完美的变量。但基本上任何方式都可以让我在所有控制器之间共享一个变量。
在我的AccountsController中,我查询标准数据库以获取正确的名称。然后我使用configure::write('CompanyDB', $myDbVar)
。这个工作对于这个控制器很好,但我不能在任何其他控制器中使用configure::read('CompanyDB')
。
在我的AppModel中,我有一个构造函数,它根据前面提到的configure::read('campanyDB')
中的值来设置数据库连接,我需要在所有控制器中使用configure::write('CompanyDB',$myDbVar)
来实现这一点。
在我的帐户模型中,我设置了$specific=true
。这告诉AppModel它应该使用构造并更改数据库连接。
class AccountsController extends AppController {
public $helpers = array('Html', 'Form','Js');
public $components = array('RequestHandler');
var $uses = array('User', 'Company');
public $name = 'Accounts';
public $myDbVar='coolbeans';
public function beforeFilter() {
parent::beforeFilter();
Configure::write( 'companyDB',$this->myDbVar);
}
}
class AppModel extends Model {
var $specific = false;
function __construct($id = false, $table = null, $ds = null) {
if ($this->specific) {
// Get saved company/database name
$dbName = Configure::read('companyDB');
// Get common company-specific config (default settings in database.php)
$config = ConnectionManager::getDataSource('companySpecific')->config;
// Set correct database name
$config['database'] = $dbName;
// Add new config to registry
ConnectionManager::drop('companySpecific');
ConnectionManager::create('companySpecific', $config);
// Point model to new config
$this->useDbConfig = 'companySpecific';
}
parent::__construct($id, $table, $ds);
}
}
class Account extends AppModel {
public $primaryKey = '_id';
//var $useDbConfig = 'mongo';
var $specific = true;
.....
}
答案 0 :(得分:1)
可能最好的选择是使用配置文件:
基本思路是,在Config/
目录中创建一个包含应用程序设置的文件,然后在引导程序中加载该配置文件,这样可以在应用程序的任何位置使用这些变量。
示例文件:Config/dbconnections.php
<?php
$config = array(
'MyAppDBs' => array(
'company1' => 'connectionName',
'company2' => 'differentConnectionName
)
);
在你的bootstrap文件中:
Configure::load('dbconnections');
您应用中的任何位置:
$whatever = Configure::read('MyAppDBs.companyDB');
答案 1 :(得分:0)
我想如果你这样做
configure::write('CompanyDB', $myDbVar);
在你的appController中然后你可以使用
在任何控制器中访问它configure::write('CompanyDB',$myDbVar);
因为所有控制器都继承了appController。