我的CakePHP项目使用了两个数据库,分别命名为project
和project_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
黑客效率不高,我认为直接在加载时调整配置app.php
像这样:
$config = [
[...],
'Datasources' => [
'dev' => [...],
'prod' => [...]
],
'UseDatasourcesConfig' => 'dev',
[...],
];
$config['Datasources']['default'] = $config['Datasources']['UseDatasourcesConfig'];
return $config;
。听起来,也像黑客。
第二种方法可行吗?还是存在更正式/正确的全局设置数据库配置的方法?
根据环境提供配置是一项非常常见的任务,还有很多其他方法可以解决这个问题。
环境变量
如果环境允许,您可以使用环境变量。您可以通过 DSN 连接字符串形式的DATABASE_URL
变量轻松提供数据库配置,例如
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);
说明书>配置>加载其他配置文件
连接别名
还有连接混叠,CakePHP 在测试环境中自动执行此操作。假设您有一个default
和一个production
的confiation,则可以在生产环境中将production
连接别名为default
,这样您的代码在尝试使用default
连接的地方,它实际上都会使用production
连接。
CakeDataSourceConnectionManager::alias('production', 'default');
API> \Cake\DataSource\ConnectionManager::alias()