Подтвердить что ты не робот

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

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

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

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

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

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

Это означает, что мы не можем на 100% полагаться только на parameters.ini или на любой статически называемый файл, так как разработчику потребуется контролировать конфигурацию для каждого сервера плюс все эти файлы будут жить рядом друг с другом в 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 не будет работать)
4b9b3361

Ответ 1

Хорошо, я наконец понял, что делать для этого. На самом деле просто требуется базовая модификация 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 в приложении /config/server/ по мере необходимости.

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