我的 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 尝试使用默认
数据库配置。
我担心我的 AppTable.php
hack 效率不高,我认为直接在 app.php
中调整加载配置,如下所示:
$config = [
[...],
'Datasources' => [
'dev' => [...],
'prod' => [...]
],
'UseDatasourcesConfig' => 'dev',
[...],
];
$config['Datasources']['default'] = $config['Datasources']['UseDatasourcesConfig'];
return $config;
...听起来也像黑客。
第二种方法可行吗?或者是否存在更正式/正确的全局设置数据库配置的方法?
最佳答案
根据环境提供配置是一项非常常见的任务,还有很多其他方法可以处理此问题。
环境变量
如果环境允许,您可以使用环境变量。您可以通过 DATABASE_URL 变量以 DSN 连接字符串的形式轻松提供数据库配置,例如
mysql://user:pass@localhost/production?encoding=utf8&timezone=UTC&cacheMetadata=true
Cookbook > Configuration > Environment Variables
其他配置文件
另一个选项是根据当前环境加载单独/附加的配置文件,以便您可以仅部署特定环境实际需要的那些文件。
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);
Cookbook > Configuration > Loading Additional Configuration Files
连接别名
还有连接别名,CakePHP 在测试环境中自动执行此操作。假设您有一个 default
和一个 product
配置,那么您可以在生产中将 product
连接别名为 default
环境,以便您的代码在任何尝试使用默认
连接的地方,实际上都会使用生产
连接。
\Cake\DataSource\ConnectionManager::alias('production', 'default');
关于php - 全局更改 CakePHP 数据库配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43126347/