全局更改CakePHP数据库配置

时间:2017-03-30 19:02:35

标签: php mysql database cakephp

我有两个用于CakePHP项目的数据库,分别名为projectproject_dev。数据库project用于生产,因为从版本3开始,CakePHP删除了表前缀选项,我选择使用两个独立的数据库。

从我的/config/app.php中提取:

'Datasources' => [
    'dev' => [...],
    'prod' => [...]
]

问题是我需要使用dev数据库...进行开发;所以我需要告诉Cake在开发过程中默认使用dev配置。

为此,我尝试创建一个AppTable.php,一个由我的所有* Table.php文件继承的类,具有以下功能:

/**
 * Define the connection name based on the debug config value
 * @return string the connection name
 */
public static function defaultConnectionName(): string {
    return Configure::read('debug') ? 'dev' : 'prod';
}

一些任务的问题,例如单元测试,Cake正试图使用​​default数据库配置。

我担心我的AppTable.php hack效率不高,而且我认为在app.php中直接调整加载配置是这样的:

$config = [
    [...],
    'Datasources' => [
        'dev' => [...],
        'prod' => [...]
    ],
    'UseDatasourcesConfig' => 'dev',
    [...],
];

$config['Datasources']['default'] = $config['Datasources']['UseDatasourcesConfig'];

return $config;

......听起来像是一个黑客。

第二种方法是否可行?或者是否存在一种更正式/适当的方式来全局设置数据库配置?

1 个答案:

答案 0 :(得分:2)

根据环境提供配置是一项非常常见的任务,还有很多其他方法可以解决这个问题。

环境变量

如果环境允许,您可以使用环境变量。您可以通过make main.s变量以DSN连接字符串(如

)的形式轻松提供数据库配置
make main.i

<强> Cookbook > Configuration > Environment Variables

其他配置文件

另一种选择是根据当前环境加载单独/附加的配置文件,以便您只能部署特定环境实际需要的那些文件。

DATABASE_URL

<强> Cookbook > Configuration > Loading Additional Configuration Files

连接别名

还有连接别名,CakePHP在测试环境中自动完成。假设您有mysql://user:pass@localhost/production?encoding=utf8&timezone=UTC&cacheMetadata=true Configure::load('app', 'default', false); // $enviroment needs to be validated /sanitzied in order to // avoid loading arbitrary files from the config directory Configure::load($enviroment, 'default', true); 配置,那么您可以在生产环境中将default连接别名为production,以便您的代码尝试使用{ {1}}连接,实际上会使用production连接。

default

<强> API > \Cake\DataSource\ConnectionManager::alias()