Symfony 2 - конфигурация с несколькими серверами
Мы начинаем использовать Symfony 2 для проектов здесь, на работе, и это здорово, но есть проблема, над решением которой я работаю, и я почти справился, но не совсем.
Symfony рассматривает концепцию среды как отдельную среду выполнения на одном сервере. Это здорово, потому что вы можете переключаться между средами выполнения с помощью разных фронтальных контроллеров (web) или с помощью переключателя env (cli) по прихоти.
Однако наш код развертывается на многих серверах в рамках разработки процесс. У каждого есть локальная виртуальная машина, затем код распространяется через интеграцию, контроль качества, промежуточную обработку и, наконец, производство.
Итак, наша концепция среды - сервер (виртуальный или физический). Вот цели с этой пользовательской конфигурацией
- Поддерживать функциональность ootb Symfony в отношении переключения среды выполнения
- Разрешить публичную (т.е. контролируемую разработчиком) конфигурацию для каждого сервера
- Поддерживать частную (т.е. управляемую системой) конфигурацию для каждого сервера
- Будет работать как для Интернета, так и для командной строки
Это означает, что мы не можем на 100% полагаться на parameters.ini или любой файл со статическим именем, если на то пошло, поскольку разработчику потребуется контроль над конфигурацией для каждого сервера, плюс все эти файлы будут жить рядом друг с другом в git.
Итак, что бы я хотел сделать, так это вот что. Добавьте новое значение в файл parameters.ini, которое задает среду сервера. Что-то вроде это
Приложение/конфигурация/параметры.ini
[parameters]
server="int"
А затем в ядре загрузите дополнительный файл конфигурации на основе этого значения. Например, я бы хотел, чтобы это сработало, но это не так (поскольку контейнер еще не существует на этом этапе)
App/AppKernel.php
public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
// Per-server config
$server = $this->getContainer()->getParameter( 'server' );
if ( $server )
{
$loader->load(__DIR__.'/config/server/'.$server.'.yml');
}
}
Это позволило бы использовать файл, подобный app/config/server/int.yml, который разработчик может использовать для управления непубличной (т.Е. не parameters.ini) конфигурацией ценности.
Спасибо за чтение, и дайте мне знать, если что-то вас смущает.
РЕДАКТИРОВАТЬ
Для уточнения, вещи, которые я не могу использовать или полагаться на
- *переменные среды nix из профиля пользователя или через
export
. Почему? Интеграция, контроль качества и промежуточная подготовка могут находиться в одном и том же поле - Что-нибудь в конфигурации vhost (не будет работать для cli)
- Файл со статическим именем (т.Е. Что-то только что названное server.ini не будет работать)
1 answers
Хорошо, я наконец-то понял, что для этого нужно сделать. На самом деле просто потребовалась базовая модификация ядра приложения
App/AppKernel.php
public function registerContainerConfiguration(LoaderInterface $loader)
{
// Symfony environment config
$loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
// Load server config, if it exists
$parameters = parse_ini_file( __DIR__.'/config/parameters.ini', true );
if ( $parameters && isset( $parameters['parameters']['server.env'] ) )
{
$serverConfig = __DIR__.'/config/server/'.$parameters['parameters']['server.env'].'.yml';
if ( file_exists( $serverConfig ) )
{
$loader->load( $serverConfig );
} else {
error_log( 'Server config defined, but no config file found. Looked for ' . $serverConfig );
}
}
}
Приложение/конфигурация/параметры.ini
[parameters]
# ...
server.env="int"
server.title="Integration"
server.name="Int 1"
И теперь я могу просто создать %server.env%.yml файлы в app/config/server/ по мере необходимости.
Спасибо тем, кто прочитал это - я изначально думал о чем-то гораздо более сложном, что сделало это простое решение невидимым на некоторое время ;)