Symfony 2 - Konfiguration für mehrere Server

Wir fangen an, Symfony 2 für Projekte hier bei der Arbeit zu übernehmen, was großartig ist, aber es gibt eine Herausforderung, an deren Lösung ich arbeite, die ich fast habe, aber nicht ganz.

Symfony behandelt das Konzept einer Umgebung als separate Laufzeit auf einem einzelnen Server. Dies ist großartig, da Sie mit verschiedenen Front-Controllern (Web) oder nach Belieben mit dem Env-Schalter (CLI) zwischen den Laufzeiten wechseln können.

Unser Code wird jedoch im Rahmen des Entwicklungsprozesses auf vielen Servern bereitgestellt. Jeder hat eine lokale VM, und der Code wird durch Integration, Qualitätssicherung, Staging und schließlich durch Produktion weitergegeben.

Unser Konzept einer Umgebung ist also ein Server (virtuell oder physisch). Hier sind die Ziele dieser benutzerdefinierten Konfiguration

Behalten Sie die Symfony-ootb-Funktionalität in Bezug auf das Umschalten der Laufzeitumgebung beiÖffentliche (d. H. Vom Entwickler kontrollierte) Konfiguration pro Server zulassenBehalten Sie die private (d. H. Sysad-gesteuerte) Konfiguration pro Server beiFunktioniert sowohl für das Web als auch für das CLI

Das heißt, wir können uns nicht nur zu 100% darauf verlassenparameters.ini oder jede statisch benannte Datei, da der Entwickler die Kontrolle über die Konfiguration für jeden Server haben muss und alle diese Dateien nebeneinander in Git gespeichert werden.

Also, was würde ichmögen zu tun ist das. Fügen Sie parameters.ini einen neuen Wert hinzu, der die Serverumgebung festlegt. Etwas wie das

app / config / parameters.ini

<code>[parameters]
    server="int"
</code>

Laden Sie dann im Kernel eine zusätzliche Konfigurationsdatei, die auf diesem Wert basiert. Zum Beispiel würde ich gerne, dass dies funktioniert, aber es funktioniert nicht (da der Container in diesem Schritt noch nicht vorhanden ist).

app / AppKernel.php

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

Dies würde die Verwendung einer Datei wie ermöglichenapp / config / server / int.yml dass der Entwickler nicht-private (d. h. nicht parameters.ini) Konfigurationswerte steuern kann.

Vielen Dank fürs Lesen und lassen Sie mich wissen, wenn etwas verwirrend ist.

BEARBEITEN

Zur Klarstellung, Dinge, die ichkippen verwenden oder sich darauf verlassen

* nix Umgebungsvariablen aus dem Benutzerprofil oder überexport. Warum? Integration, QA und Staging befinden sich möglicherweise in derselben BoxAlles in der VHOST-Konfiguration (funktioniert nicht für CLI)Eine Datei mit statischem Namen (d. H. Etwas, das gerade benannt wurde)server.ini wird nicht funktionieren)
 hakre04. Apr. 2012, 17:39
Warum müssen Sie Ihrer Meinung nach die Symfony2-Umgebung verwenden, um Ihre Server-Umgebungen zu verwalten?
 Mun Mun Das04. Apr. 2012, 21:01
Sie können das immer noch analysierenparameters.ini mitparse_ini_file Methode. Obwohl ich Ihr Problem nicht klar verstanden habe. Wollen Sie damit sagen, dass jede Serverkonfigurationsdatei eine andere Routing- / Sicherheitskonfiguration hat?
 Peter Bailey04. Apr. 2012, 17:44
Ich bin nicht per se. Ich versuche nur herauszufinden, wie die Konfiguration pro Server am besten geladen werden kann, die weiterhin von den Entwicklern gesteuert wird.
 Peter Bailey04. Apr. 2012, 23:15
Sie können meine Lösung unten lesen. Es ist schwer zu beschreiben, hoffentlich macht die Lösung es klarer.

Antworten auf die Frage(1)

Lösung für das Problem

ich habe endlich herausgefunden, was ich dafür tun soll. Wirklich nur eine grundlegende Änderung am AppKernel erforderlich

app / AppKernel.php

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

app / config / parameters.ini

<code>[parameters]
    # ...
    server.env="int"
    server.title="Integration"
    server.name="Int 1"
</code>

Und jetzt kann ich einfach schaffen% server.env% .yml Dateien inapp / config / server / wie benötigt.

Vielen Dank an diejenigen, die dies gelesen haben - ich dachte ursprünglich an etwas viel Komplizierteres, das diese einfache Lösung für eine Weile unsichtbar machte;)

Ihre Antwort auf die Frage