У меня есть две базы данных, используемые для моего проекта 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 ()