如何让Cakephp 3通过Apache环境变量选择数据库连接

How to let Cakephp 3 choose database connection by Apache environment variable

我正在使用 cakephp v3,我想在两种不同的环境中安装该应用程序,一种用于开发,一种用于生产。两个安装应包含完全相同的文件(和文件内容),因此我可以使用 'git' 或 'svn' 轻松部署应用程序。

如果两个环境都托管在同一台机器上,我需要不同的数据库设置(以便开发环境使用自己的 'testing' 数据库)。我想在 app.php 中配置两个 'Datasources','default' 一个用于生产,一个用于“开发”。

但是如何在两个来源之间切换?

更具体地说:目前我在我的 Apache 配置中为开发环境定义了以下环境变量:

SetEnv CAKEPHP_DEBUG 1

然后我在 app.php 文件中更改了 'debug' 的定义,如下所示:

'debug' => (bool)getenv('CAKEPHP_DEBUG'),

这仅在开发机器上启用 DEBUG 模式。现在我也想以同样简单的方式切换数据库配置。

(我已经找到了一些适用于 cakephp v2 的解决方案,但它们都已经过时了,我不确定在 cakephp v3 中最好的解决方案是什么。)

manual

You can define as many connections as you want in your configuration file. You can also define additional connections at runtime using Cake\Datasource\ConnectionManager::config().

所以我想你可以检查 AppController beforeFilter 中调试的值并更改默认数据库连接

AppController.php

if(Configure::read('debug') == 1)
{
    ConnectionManager::config('default', [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'dev_server',
        'username' => 'dev_username',
        'password' => 'dev_passwd',
        'database' => 'development',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
    ]);
}

我认为您可以使用三元运算符

在app.php中做类似的事情

app.php

'Datasources' => [
    'default' => getenv('CAKEPHP_DEBUG')== 1 ? [ /* debug params */ ] : [ /* default params */]
    ...
]

但不知何故,这似乎不是 'clean' 的方法

我认为更简洁的方法是在 app.php 中设置两个配置,然后在 appController 中选择要使用的配置

app.php

'Datasources' => [
    'debug' => [ /* debug params */ ],
    'default' => [ /* default params */]
]

Table 文件

public static function defaultConnectionName() {
    if(Configure::read('debug') == 1)
        return 'debug';
    return 'default';
}