数据库在 CakePHP3 中的生产、开发和测试之间切换

DB switch between Production, Develop and Test in CakePHP3

我目前在 config/app.php 中有两个数据库设置,一个名为 "default" 用于生产,另一个名为 "test" 用于开发。我现在想将当前的 "test" 重命名为 "dev" 并进行第三次设置,将其命名为新的 "test" 用于测试目的。 在生产数据库和开发数据库之间切换工作正常,但是当我仍在开发环境中(在开发分支上工作)时,我的应用程序如何知道何时使用测试数据库?我应该对哪些文件进行哪些更改? 我整天都在谷歌搜索,但我能找到的只是在生产和开发之间切换的方法。我需要知道如何在开发和测试之间切换。

以下是我的想法,但我很确定我还必须修改其他一些文件才能使它们正常工作。

# config/app.php

'Datasources' => [

  // Production
  'default' => [
    'className' => 'Cake\Database\Connection',
    'driver' => 'Cake\Database\Driver\Mysql',
    'persistent' => false,
    'host' => 'MY PRODUCTION HOST',
    'username' => 'MY PRODUCTION USERNAME',
    'password' => 'MY PRODUCTION PASSWORD'
    'database' => 'MY PRODUCTION DATABASE NAME'
    'quoteIdentifiers' => false,
    // 'encoding' and so on...
  ],

  // Development
  'dev' => [
    'className' => 'Cake\Database\Connection',
    'driver' => 'Cake\Database\Driver\Mysql',
    'persistent' => false,
    'host' => 'MY DEVELOPMENT HOST',
    'username' => 'MY DEVELOPMENT USERNAME',
    'password' => 'MY DEVELOPMENT PASSWORD'
    'database' => 'dev'
    'quoteIdentifiers' => false,
    // 'encoding' and so on...
  ],

  // Test
  'test' => [
    'className' => 'Cake\Database\Connection',
    'driver' => 'Cake\Database\Driver\Mysql',
    'persistent' => false,
    'host' => 'SAME AS MY DEVELOPMENT HOST',
    'username' => 'SAME AS MY DEVELOPMENT USERNAME',
    'password' => 'SAME AS MY DEVELOPMENT PASSWORD'
    'database' => 'test'
    'quoteIdentifiers' => false,
    // 'encoding' and so on...
  ]
],

我是 CakePHP 的新手,所以任何 advices/suggestions 都将不胜感激。谢谢!

一种方法是在您的开发环境中设置一个未在生产环境中设置的环境变量,例如:

DEV_ENVIRONMENT=true

在应用程序的启动脚本中,您可以在 config/bootstrap.php 中查找该环境变量,如果已设置,您可以将 default 连接别名设置为 dev:

bootstrap.php:

// Look for this line:
ConnectionManager::setConfig(Configure::consume('Datasources'));

// Add your code someplace after that:
if(getenv('DEV_ENVIRONMENT')){
    ConnectionManager::alias('dev', 'default');
}

每当在应用程序中引用 default 连接时,alias 函数将加载 dev 数据源(除非被覆盖,否则所有表都会这样做)。

这通常与 PhpUnit 测试在测试运行期间用于替代 test 数据源配置的方法相同。