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