20

Вопрос по symfony, configuration, php – Symfony 2 - конфигурация с несколькими серверами

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

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

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

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

  1. Maintain Symfony's ootb functionality in respect to runtime environment switching
  2. Allow for public (i.e., developer controlled) configuration per-server
  3. Maintain private (i.e., sysad controlled) configuration per-server
  4. Will work for both web and cli

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

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

app/config/parameters.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) значениями конфигурации.

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

EDIT

Для уточнения вещей яcan't использовать или положиться на

  • *nix environment variables from the user's profile or via export. Why? Integration, QA, and Staging might all be on the same box
  • Anything in the vhost config (won't work for cli)
  • A statically-named file (i.e., something just named server.ini won't work)
  • Вы можете прочитать мое решение ниже. Это сложный сценарий для описания, надеюсь, решение сделает его более понятным.

    от Peter Bailey
  • Как вы думаете, зачем вам нужно использовать среду Symfony2 для работы с серверными средами?

    от hakre
  • Я нет, как таковой. Я просто пытаюсь найти лучший способ загрузить конфигурацию для каждого сервера, которая все еще будет находиться под контролем разработчиков.

    от Peter Bailey
  • Вы все еще можете разобратьparameters.ini с помощьюparse_ini_file метод. Хотя я не совсем понял вашу проблему. Вы говорите, что каждый файл конфигурации сервера будет иметь различные конфигурации маршрутизации / безопасности?

    от Mun Mun Das
  • 29

    Хорошо

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

    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 );
        }
      }
    }
    

    app/config/parameters.ini

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

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

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