Я недавно переключил один из своих проектов на использование git, и я хотел, чтобы у каждой создаваемой мной ветки были собственные параметры конфигурации, например, я мог тестировать изменения в базе данных в одной ветви, чтобы должен загрузить другой экземпляр БД.
До этого у меня был один файл application.ini с [production], [staging: production] и [development: staging], он находился под контролем исходного кода, и каждый раздел включал мои учетные данные для входа в базу данных. Не идеально.
Итак, теперь я отредактировал файл application.ini, чтобы установить раздел [по умолчанию] и список ветвей, которым разрешено запускать приложение. Вот сокращенная версия:
; application.ini
[default]
; Error handler settings
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
[production : default]
[staging : default]
[master : default]
[dbupgradeidea : default]
В моем public_html/index.php
я теперь создаю Zend_Config_Ini
из этого и устанавливаю 'allowModifications' => true
.
$defaultConfig = new Zend_Config_Ini(
APPLICATION_PATH . '/configs/application.ini',
null,
array(
'allowModifications' => true
));
Затем я пытаюсь загрузить специфичные для ветви параметры в зависимости от среды, в которой работает приложение (устанавливается с помощью .htaccess с помощью SetEnv APPLICATION_ENV <branch-name>
Например, промежуточный сервер устанавливает его в промежуточное состояние.
try {
$branchConfig = new Zend_Config_Ini(
APPLICATION_PATH . '/configs/branch-' . APPLICATION_ENV . '.ini'
);
} catch (Zend_Config_Exception $e) {
die('/configs/branch-' . APPLICATION_ENV . '.ini file not found.');
}
В каталоге
My application/configs
содержится файл branch.sample.ini
с пустым списком параметров, которые должны быть определены каждой ветвью. Также есть запись под .gitignore
для branch-*
, чтобы специфичные для ветви настройки не включались в репозиторий.
Теперь я объединяю два конфига вместе и преобразую в массив для Zend_Application:
$appConfig = $defaultConfig->merge( $branchConfig );
$appOptions = $appConfig->get( APPLICATION_ENV )->toArray();
// Include the Zend_Application class so we can start the App
require_once 'Zend/Application.php';
$application = new Zend_Application(
APPLICATION_ENV,
$appOptions
);
Мой рабочий сервер - это просто развертывание производственной ветви под git, то же самое для промежуточного сервера, и любая локальная разработка, которую я делаю, основана на ветви, которую я в данный момент извлек.
Я хотел написать пост в блоге об этом, на всякий случай, если это кому-нибудь помогло, но потом я понял, что это может быть совершенно дурацкий способ сделать что-то, и хотел сначала пропустить его мимо вас, народы.
Пожалуйста, предложите лучшие способы достижения того же результата, или, если вы считаете, что процесс в корне ошибочен, укажите это.
Ура!