php - 全局更改 CakePHP 数据库配置

标签 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 尝试使用默认数据库配置。

我担心我的 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');

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

关于php - 全局更改 CakePHP 数据库配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43126347/

相关文章:

php - INNER JOIN 不会产生任何行

php - 将查询传递给 PDO 时出错

android - Android:如何将单个表字段的值设置为String变量?

php - 将 Mysql 附近查询转换为 Laravel API 查询

php - 如何使用ajax在DIV中加载AngularJs页面

mysql - mysql重启后第一次查询很慢

mysql - 如何让 golang mysql 驱动程序在 2 秒内超时 ping?

mysql - Kubernetes 多数据库实例或 HA 单实例

mysql - Matlab 数据库工具箱 - 警告 : com. mysql.jdbc.Connection@6e544a45 不可序列化

php - 我如何使用 php 检测机器是否安装了 oracle(oci8 和/或 pdo_oci)?