Symfony 2 – конфигурация нескольких серверов

Мы начинаем принимать Symfony 2 для проектов здесь, на работе, это здорово, но есть проблема, над которой я работаю, чтобы решить, что я почти получил, но не совсем.

Symfony рассматривает концепцию среды как отдельную среду выполнения на одном сервере. Это здорово, потому что вы можете переключаться между режимами работы с разными передними контроллерами (web) или с помощью переключателя env (cli) по прихоти.

Однако наш код развертывается на многих серверах как часть процесса разработки. У каждого есть локальная виртуальная машина, затем код распространяется через интеграцию, QA, Staging и, наконец, Production.

Итак, наша концепция среды – это сервер (виртуальный или физический). Вот цели с этой настраиваемой конфигурацией

  1. Поддерживайте функциональность ootb Symfony в отношении переключения среды выполнения
  2. Разрешить публичную (т.е. контролируемую разработчиком) конфигурацию для каждого сервера
  3. Поддерживать индивидуальную (т.е. управляемую sysad) конфигурацию для каждого сервера
  4. Будет работать как для web, так и для cli

Это означает, что мы не можем только 100% полагаться на parameters.ini или на любой статически именованный файл, поскольку разработчик должен будет контролировать конфигурацию для каждого сервера, и все эти файлы будут жить рядом с eachother в git.

Итак, я бы хотел сделать это. Добавьте новое значение в параметры.ini, который устанавливает серверную среду. Что-то вроде этого

приложение / Config / parameters.ini

[parameters] server="int" 

И затем в ядре загрузите дополнительный файл конфигурации на основе этого значения. Например, мне бы хотелось, чтобы это работало, но это не так (поскольку на этом этапе контейнер еще не существует)

Приложение / 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, который разработчик может использовать для управления значениями, не относящимися к частным (т.е. не параметрам.ini).

Спасибо за чтение и дайте мне знать, если что-то сбивает с толку.

РЕДАКТИРОВАТЬ

Для уточнения вещей, которые я не могу использовать или полагаться на

  • * nix переменные среды из профиля пользователя или через export . Зачем? Интеграция, QA и Staging могут быть в одной коробке
  • Все в конфигурации vhost (не будет работать для cli)
  • Статически называемый файл (т. Е. Что- то только что названное server.ini не будет работать)

Хорошо, я наконец понял, что делать для этого. На самом деле просто требуется базовая модификация AppKernel

Приложение / 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 ); } } } 

приложение / Config / parameters.ini

 [parameters] # ... server.env="int" server.title="Integration" server.name="Int 1" 

И теперь я могу просто создать % server.env% .yml- файлов в app / config / server / по мере необходимости.

Спасибо тем, кто читал это – я изначально думал о чем-то гораздо более сложном, что заставило это простое решение невидимым на некоторое время;)