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


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

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

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

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

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

Это означает, что мы не можем на 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 не будет работать)
Author: Peter Bailey, 2012-04-04

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/ по мере необходимости.

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

 29
Author: Peter Bailey, 2012-05-02 04:17:13