Переключение БД между производством, разработкой и тестированием в CakePHP3

#php-7 #cakephp-3.x

#php-7 #cakephp-3.x

Вопрос:

В настоящее время у меня есть две настройки базы данных в моем config/app.php , один с именем «default» для производства, другой с именем «test» для разработки. Теперь я хочу переименовать текущий «test» в «dev» и сделать 3-ю настройку, назвав ее новым «test» для целей тестирования. Переключение между производственной базой данных и базой данных разработки работает нормально, но как мое приложение узнает, когда использовать тестовую базу данных, пока я все еще в среде разработки (работаю над веткой разработки)? Какие изменения я должен внести в какие файлы? Я весь день гуглил, но все, что я могу найти, это способ переключения между производством и разработкой. Мне нужно знать, как переключаться между разработкой и тестированием.

Ниже приведено то, что я имею в виду, но я уверен, что мне нужно также изменить некоторые другие файлы, чтобы заставить их работать правильно.

 # config/app.php

'Datasources' => [

  // Production
  'default' => [
    'className' => 'CakeDatabaseConnection',
    'driver' => 'CakeDatabaseDriverMysql',
    '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' => 'CakeDatabaseConnection',
    'driver' => 'CakeDatabaseDriverMysql',
    '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' => 'CakeDatabaseConnection',
    'driver' => 'CakeDatabaseDriverMysql',
    '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, поэтому буду признателен за любые советы / предложения. Спасибо!

Ответ №1:

Одним из способов было бы установить переменную среды в вашей среде разработки, которая не установлена в производстве, например:

 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');
}
  

Функция псевдонима будет загружать dev источник данных каждый раз default , когда в приложении упоминается соединение (что делают все таблицы, если они не переопределены).

Обычно это тот же метод, который тесты PHPUnit используют для замены конфигураций test источника данных во время тестовых запусков.