2011-09-07 14 views
14

Quiero hacer un archivo de configuración local, config_local.yml, que permita que cada entorno de desarrollo se configure correctamente sin atornillar los entornos de desarrollo de otras personas. Quiero que sea un archivo separado para poder "gitignore" y saber que no falta nada esencial del proyecto, mientras que al mismo tiempo no tengo el problema de que git me diga constantemente que config_dev.yml tiene nuevos cambios (y corre el riesgo de alguien que comete esos cambios).¿Puedo incluir un archivo de configuración opcional en Symfony2?

En este momento, config_dev.yml He haciendo

imports: 
    - { resource: config_local.yml } 

que es grande, a menos que no existe el archivo (es decir, para un nuevo clon del repositorio).

Mi pregunta es: ¿Hay alguna manera de hacer que esto sea opcional? Es decir, si el archivo existe, entonces impórtelo, de lo contrario ignórelo.

Editar: que estaba esperando una sintaxis como:

imports: 
    - { resource: config.yml } 
    ? { resource: config_local.yml } 

Respuesta

8

Una solución es crear un entorno separado, que se explica en el Symfony2 cookbook. Si no desea crear uno, existe otra forma de crear una extensión.

// src/Acme/Bundle/AcmeDemo/DepencendyInjection/AcmeDemoExtension.php 
namespace Acme\DemoBundle\DependencyInjection; 

use Symfony\Component\Config\FileLocator; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; 
use Symfony\Component\HttpKernel\DependencyInjection\Extension; 

class AcmeDemoExtension extends Extension 
{ 
    public function load(array $configs, ContainerBuilder $container) 
    { 
     // All following files will be loaded from the configuration directory 
     // of your bundle. You may change the location to /app/ of course. 
     $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); 

     try 
     { 
      $loader->load('config_local.yml'); 
     } 
     catch(\InvalidArgumentException $e) 
     { 
      // File was not found 
     } 
    } 
} 

Algunos de excavación en el código de Symfony me reveló que YamlFileLoader::load() FileLocator::locate() arrojará \InvalidArgumentException, si no se encuentra un archivo. Se invoca por YamlFileLoader::load().

Si utiliza las convenciones de nomenclatura, la extensión se ejecutará automáticamente. Para una explicación más completa, visit this blog.

+1

Tu respuesta me hace pensar que tal vez podría crear su propio 'YamlFileLoader' que fallaría correctamente si no se puede encontrar un archivo yml. –

+1

Muy buena respuesta, gracias. Ojalá pudiera dar +2 –

+1

@arms Sí, esto también es posible, pero solo tendría que crear un 'FileLocator' personalizado en lugar de' YamlFileLoader'. Esa excepción se lanza en 'Symfony \ Component \ Config \ FileLocator :: locate', por lo que tendremos que extender la clase base para que la carga falle correctamente. – gilden

16

Hay otra opción.

en app/appKernel.php cambiar el método registerContainerConfiguration a esto:

public function registerContainerConfiguration(LoaderInterface $loader) 
{ 
    $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml'); 

    $extrafiles = array (
     __DIR__.'/config/config_local.yml', 
    ); 

    foreach ($extrafiles as $filename) { 
     if (file_exists($filename) && is_readable($filename)) { 
      $loader->load($filename); 
     } 
    } 
} 

esta manera tiene un archivo config_local.yml global que sobrescribe los archivos config_env.yml

+1

esta es una buena idea, gracias –

1

que probé las dos respuestas anteriores pero ninguno funcionó para mí.

  1. Hice un nuevo entorno: "local" que importa "dev", pero como se puede leer aquí: There is no extension able to load the configuration for "web_profiler" también se tuvo que cortar la clase AppKernel.
    Además, no se pudo establecer config_local.yml en .gitignore porque el archivo es necesario en el entorno local.

  2. Ya que tenía que cortar el AppKernel todos modos i intentado la aproximación con los $ extrafiles pero que resultó en "ForbiddenOverwriteException"

Así que ahora lo que funcionó para mí fue una modificación del enfoque extrafiles $:
reemplazar en la aplicación/AppKernel.php
$loader->load(__DIR__ . '/config/config_' . $this->getEnvironment() . '.yml');
con

if ($this->getEnvironment() == 'dev') { 
     $extrafiles = array(
      __DIR__ . '/config/config_local.yml', 
     ); 
     foreach ($extrafiles as $filename) { 
      if (file_exists($filename) && is_readable($filename)) { 
       $loader->load($filename); 
      } 
     } 
    } else { 
     $loader->load(__DIR__ . '/config/config_' . $this->getEnvironment() . '.yml'); 
    } 
22

Sé que esto es una pregunta muy viejo, y yo creo que la solución aprobada es mejor que pensé que le daría una solución más simple que tiene la ventaja de no cambiar ningún código

puede utilizar la opción ignore_errors, que no mostrará ningún error si el archivo no existe

imports: 
    - { resource: config_local.yml, ignore_errors: true } 

Advertencia, si tiene un error de sintaxis en el archivo, también se ignorará, por lo que si tiene resultados inesperados, asegúrese de que no haya ningún error de sintaxis u otro error en el archivo.

Cuestiones relacionadas