2011-10-13 14 views
6

Sé que puedo sobreescribir plantillas o extender clases de otros paquetes. ¿Pero puedo extender también las configuraciones? Esperaba poder cargar otros espacios de nombres desde config en el método de carga DependenyInjection/AcmeExtension.php, pero no he encontrado nada al respecto en ninguna parte.¿Cómo extender la configuración de diferente paquete en Symfony2?

Ejemplo:

tengo AcmeBundle que define siguiente en config:

acme: 
    a: 1 

quiero extender este paquete (en nuevo paquete llamado AwesomeAcmeBundle) y ser capaz de definir otras variables de ya sea por añadiéndolos a espacio de nombres originales:

acme: 
    a: 1 
    b: 2 

o envolviendo espacio de nombres originales a un nuevo nd añadiendo nuevas variables que hay:

awesome_acme: 
    a: 1 
    b: 2 

Respuesta

1

Si estamos hablando acerca de los .yml s, puede importar el AcmeBundle s confing en el AwesomeAcmeBundle configuración con

imports: 
    - { resource: path/to/AcmeBundles/config.yml } 

y luego sobrescribir los parámetros que desee.

Symfony hace lo mismo en el config_dev.yml con el parámetro framework/router.

+0

No, eso no es exactamente lo que quise decir. Quiero extender la configuración (también conocida como 'DependencyInjection/Configuration.php') de algún paquete, no solo el archivo de configuración. –

1
imports: 
- { resource: @YourBundle/Resources/config/services.yml } 
2

que tenían necesidades similares y les han resuelto de la siguiente manera:

1) Extender la clase de configuración de los padres

//FooBundle\DependencyInjection\Configuration.php 

use DerpBundle\DependencyInjection\Configuration as BaseConfiguration; 

class Configuration extends BaseConfiguration 
{ 

    public function getConfigTreeBuilder() 
    { 
     $treeBuilder = parent::getConfigTreeBuilder(); 

     //protected attribute access workaround 
     $reflectedClass = new \ReflectionObject($treeBuilder); 
     $property = $reflectedClass->getProperty("root"); 
     $property->setAccessible(true); 

     $rootNode = $property->getValue($treeBuilder); 

     $rootNode 
      ->children() 
      ... 

     return $treeBuilder; 
    } 
} 

2) Crear propia extensión que en realidad puede manejar la nueva entradas de configuración

class FooExtension extends Extension 
{ 

    public function load(array $configs, ContainerBuilder $container) 
    { 

     $configuration = new Configuration(); 
     $config = $this->processConfiguration($configuration, $configs); 

     //custom parameters 
     $container->setParameter('new_param_container_name', $config['new_param_name']); 

    ... 
    } 
} 

3) en el app\config\config.yml que puede utilizar en su nueva foo atributo-establece todos los parámetros que derp (como un paquete principal) tiene más cualquiera de sus nuevos parámetros que ha definido en el Configuration.php.

+0

Tuve que agregar algunas configuraciones adicionales a una configuración de paquete existente. Debajo del nodo raíz de ese paquete existente. No funcionaría de esta manera porque Symfony no permite ningún otro nombre de raíz que la versión subrayada del nombre de su paquete. ¿Conoces una forma de extender realmente un árbol de configuración existente, mientras permaneces en el mismo nodo raíz? – axelvnk

Cuestiones relacionadas