Symfony 2 – configuración de servidor múltiple

Estamos comenzando a adoptar Symfony 2 para proyectos aquí en el trabajo, lo cual es genial, pero hay un desafío que estoy trabajando para resolver que casi tengo, pero no del todo.

Symfony trata el concepto de un entorno como un tiempo de ejecución separado en un único servidor. Esto es genial porque puede cambiar entre tiempos de ejecución con diferentes controladores frontales (web) o usando el interruptor env (cli) por capricho.

Sin embargo, nuestro código se implementa en muchos servidores como parte del proceso de desarrollo. Todo el mundo tiene una VM local, luego el código se propaga a través de Integración, Control de calidad, Puesta en escena y finalmente Producción.

Por lo tanto, nuestro concepto de un entorno es servidor (virtual o físico). Estos son los objectives con esta configuración personalizada

  1. Mantener la funcionalidad de Ootb de Symfony con respecto a la conmutación del entorno de tiempo de ejecución
  2. Permitir configuración pública (es decir, controlada por el desarrollador) por servidor
  3. Mantener la configuración privada (es decir, controlada por sysad) por servidor
  4. Funcionará tanto para web como para cli

Esto significa que no podemos confiar al 100% en parameters.ini o en cualquier archivo con nombre estadístico, ya que el desarrollador necesitará controlar la configuración de cada servidor, además de que todos estos archivos vivirán uno junto al otro en git.

Entonces, lo que me gustaría hacer es esto. Agregue un nuevo valor a parameters.ini que establece el entorno del servidor. Algo como esto

app / config / parameters.ini

[parameters] server="int" 

Y luego, en el kernel, cargue un archivo de configuración adicional basado en ese valor. Por ejemplo, me encantaría que esto funcione, pero no funciona (ya que el contenedor aún no existe en este paso)

aplicación / 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'); } } 

Esto permitiría el uso de un archivo como app / config / server / int.yml que el desarrollador puede usar para controlar valores de configuración no privados (es decir, no parameters.ini).

Gracias por leer, y avíseme si algo es confuso.

EDITAR

Para aclarar, cosas que no puedo usar o confiar en

  • * variables de entorno nix del perfil del usuario o de la export . ¿Por qué? La integración, QA y Staging podrían estar todos en la misma caja
  • Cualquier cosa en la configuración de vhost (no funcionará para cli)
  • Un archivo con nombre estático (es decir, algo simplemente llamado server.ini no funcionará)

Ok, finalmente descubrí qué hacer para esto. Realmente solo requirió una modificación básica en AppKernel

aplicación / 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" 

Y ahora puedo simplemente crear archivos % server.env% .yml en la aplicación / config / server / según sea necesario.

Gracias a aquellos que leen esto, originalmente estaba pensando en algo mucho más complicado que hizo invisible esta solución simple por un tiempo;)