Изменение конфигурации базы данных CakePHP во всем мире

У меня есть две базы данных, используемые для моего проекта CakePHP, соответственно названного project и project_dev . Проект базы данных используется в производстве, и поскольку с версии 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 пытается использовать конфигурацию базы данных по default .

Я боюсь, что мой AppTable.php неэффективен, и я думаю, что настройка конфигурации при загрузке непосредственно в 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> Конфигурация> Переменные среды

Дополнительные файлы конфигурации

Другой вариант – загрузить отдельные / дополнительные файлы конфигурации на основе текущей среды, чтобы вы могли развернуть только те файлы, которые действительно необходимы для конкретной среды.

 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> Конфигурация> Загрузка дополнительных файлов конфигурации

Алиасирование соединений

И есть также псевдонимы соединений, CakePHP делает это автоматически в тестовой среде. Предположим, что у вас есть default по default и ограничение production , вы могли бы тогда присвоить production соединение по default в своей производственной среде, чтобы везде, где ваш код пытается использовать соединение по default , он фактически будет использовать production .

 \Cake\DataSource\ConnectionManager::alias('production', 'default'); 

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