Symfony 2-konfiguracja wielu serwerów

Zaczynamy przyjmować Symfony 2 do projektów tutaj w pracy, co jest świetne, ale pracuję nad rozwiązaniem wyzwania, które prawie mam, ale nie do końca.

Symfony traktuje koncepcję środowiska jako osobny tryb runtime na jednym serwerze. Jest to świetne rozwiązanie, ponieważ możesz przełączać się między przestrzeniami uruchomieniowymi z różnymi kontrolerami przednimi (web) lub za pomocą przełącznika env (cli) według kaprysu.

Jednak nasz kod jest wdrażany na wielu serwerach w ramach procesu rozwoju. Każdy ma lokalną maszynę wirtualną, a następnie kod propaguje się poprzez integrację, QA, Staging i wreszcie produkcję.

Tak więc, naszym pojęciem środowiska jest serwer (wirtualny lub fizyczny). Oto cele z tej niestandardowej konfiguracji
  1. utrzymanie funkcjonalności OOTB Symfony w odniesieniu do przełączania środowiska runtime
  2. Pozwala na publiczną (tj. kontrolowaną przez programistów) konfigurację na Serwer{[13]]}
  3. utrzymanie prywatnej (tj. kontrolowanej przez sysad) konfiguracji per-server
  4. będzie działać zarówno dla web i cli
Oznacza to, że nie możemy w 100% polegać na parametrach.ini lub jakikolwiek statycznie nazwany plik, ponieważ programista będzie potrzebował kontroli nad konfiguracją dla każdego serwera, a wszystkie te pliki będą mieszkać obok siebie w git. Więc to, co chciałbym zrobić, to zrobić to. Dodaj nową wartość do parametrów.ini, które ustawia środowisko serwera. Coś jak this

App / config / parameters.ini

[parameters]
    server="int"

A następnie w jądrze załaduj dodatkowy plik konfiguracyjny oparty na tej wartości. Na przykład chciałbym, aby to działało, ale tak nie jest (ponieważ kontener jeszcze nie istnieje na tym etapie)

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

Umożliwi to użycie pliku typu app / config / server / int.yml , którego programista może użyć do kontrolowania Nie-prywatnych (tj. nie parametrów.ini) konfiguracja wartości.

Dzięki za przeczytanie, i daj mi znać, jeśli coś jest mylące.

EDIT

Dla wyjaśnienia, rzeczy ja Nie mogę używać lub polegać

  • *zmienne środowiskowe nix z profilu użytkownika lub poprzez export. Dlaczego? Integracja, QA i Staging mogą znajdować się na tym samym pudełku
  • Wszystko w vhost config (nie będzie działać dla cli)
  • statycznie nazwany plik (np. coś o nazwie serwer.ini nie zadziała)
Author: Peter Bailey, 2012-04-04

1 answers

Ok, w końcu wiem, co z tym zrobić. Naprawdę po prostu wymaga podstawowej modyfikacji do 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"

A teraz mogę stworzyć %serwer.env%.pliki yml W app/config/server/ w razie potrzeby.

Dzięki tym, którzy to czytali-początkowo myślałem o czymś znacznie bardziej skomplikowanym, co sprawiło, że to proste rozwiązanie stało się przez chwilę niewidoczne ;)

 29
Author: Peter Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-02 04:17:13