cakephp控制器的全局变量

时间:2014-09-11 19:02:19

标签: php cakephp global-variables

我尝试更改数据库连接,具体取决于谁尝试登录我的页面。

我需要的是一种保存正确的数据库名称的方法,以便我的所有控制器都可以访问它。

使用会话会有效,但我怀疑它的安全和/或良好做法。 如果我可以从我的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;
    .....
}

2 个答案:

答案 0 :(得分:1)

可能最好的选择是使用配置文件:

读取和编写配置文件 http://book.cakephp.org/2.0/en/development/configuration.html#reading-and-writing-configuration-files

基本思路是,在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。