我有两个用于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
hack效率不高,而且我认为在app.php
中直接调整加载配置是这样的:
$config = [
[...],
'Datasources' => [
'dev' => [...],
'prod' => [...]
],
'UseDatasourcesConfig' => 'dev',
[...],
];
$config['Datasources']['default'] = $config['Datasources']['UseDatasourcesConfig'];
return $config;
......听起来像是一个黑客。
第二种方法是否可行?或者是否存在一种更正式/适当的方式来全局设置数据库配置?
答案 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