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



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

如果两个环境都托管在同一台机器上,我需要不同的数据库设置(以便开发环境使用自己的"测试"数据库)。 我想在app.php中配置两个"数据源",一个用于生产和一个"开发"的"默认"数据源。

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

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

SetEnv CAKEPHP_DEBUG 1

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

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

这仅在开发计算机上启用调试模式。 现在我还想以同样简单的方式切换数据库配置。

(我已经为 cakephp

v2 找到了一些解决方案,但所有这些解决方案都非常古老,我不确定在 cakephp v3 中做到这一点的最佳方法是什么。

手册说

您可以在配置中定义任意数量的连接 文件。您还可以在运行时使用 Cake\Datasource\ConnectionManager::config().

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

应用控制器.php

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

我认为您可以在应用程序中做类似的事情.php使用三元运算符

应用.php

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

但不知何故,这似乎不是"干净"的方式

我认为更干净的方法是在应用程序中设置两种配置.php然后在应用程序控制器中选择要使用的配置

应用.php

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

表文件

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

最新更新