2012-02-14 15 views
7

En config.yml de Symfony2 se puede añadir una "importación", tales como:Symfony2: ¿Es posible agregar configuración para otro paquete a través de DependencyInjection?

imports: 
    - { resource: services.yml } 

Dentro de mi services.yml Entonces tengo:

imports: 
    security_bundle: 
     resource: @AcmeSecurityBundle/Resources/config/services.yml 

Sin embargo, la forma alternativa de declarar los servicios de un paquete es mediante el uso de DependencyInjectionExtension eliminando así la necesidad de importar nada en config.yml manualmente desacoplando el código.

namespace Acme\Bundle\SecurityBundle\DependencyInjection; 

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

class AcmeSecurityExtension extends Extension { 

    public function load(array $configs, ContainerBuilder $container) { 
     $loader = new YamlFileLoader(
      $container, new FileLocator(__DIR__ . '/../Resources/config') 
     ); 
     $loader->load('services.yml'); 
    } 

} 

La pregunta Esto funciona bien para las declaraciones de servicio pero dicen por ejemplo que desea un paquete para configurar otro paquete, tales como la adición de LiipImagineBundle (es como AvalancheImagineBundle) Filtros:

liip_imagine: 
    filter_sets: 
     security_avatar_thumbnail: 
     quality: 75 
     filters: 
      thumbnail: { size: [140, 140], mode: inset } 

Symfony entonces se queja de que

No hay extensión capaz de cargar la configuración de r "liip_imagine"

Así que ¿alguien sabe si hay una manera de añadir la configuración de tercer haz parte de otro paquete sin tocar config.yml?

Respuesta

9

En Symfony 2.2 es posible con la ayuda de PrependExtensionInterface.

Tome un vistazo a la entrada de libros de cocina "Cómo simplificar la configuración de múltiples paquetes":

http://symfony.com/doc/current/cookbook/bundles/prepend_extension.html

+1

¡Necesité esto para FOSUserBundle! Ahora puedo crear mi extensión y precargarla con mi configuración. Ejemplo: $ contenedor-> prependExtensionConfig ('fos_user', array ( 'db_driver' => 'orm' )); –

0

creo que es posible, utilizando la clase DependencyInjection \ YourBundleExtension en su paquete, y luego hacer un

public function load(array $configs, ContainerBuilder $container) 
{ 
    ... 
    $container->setParameter('the_bundle_parameter.you.want.to.override',$itsValue); 
    ... 
} 

Pero no se sabe muy bien si es la mejor práctica o no ...

+0

Esto no funcionará porque lo que el cartel original está intentando anular no es un parámetro. Esto solo funcionaría si puede convencer al desarrollador de liip_imagine para refactorizar su paquete para que funcione a partir de una serie de parámetros en lugar de la configuración semántica (http://symfony.com/doc/current/cookbook/bundles/extension.html). Eso sería bastante trabajo para casi ningún beneficio, y probablemente no sea un beneficio para liip_imagine. –

+0

Creo que la respuesta puede ser que no es posible.Por ahora solo estoy importando un config.yml a nivel de paquete en el config.yml maestro para que mi configuración liip_imagine todavía esté encapsulada dentro del paquete al que es relevante. – Kasheen

-1

he encontrado una solución para poner filtros en el interior del paquete en lugar de en el config.yml raíz

avalanche_imagine: 
    web_root:  %kernel.root_dir%/../web 
    cache_prefix: media/cache 
    driver:  gd 
    bundle: PathToYourBundleClass 

AvalancheImagineExtension: carga añadir lo siguiente:

$bundleClass = $container->getParameter("imagine.bundle"); 
    if ($bundleClass) 
    { 
     $bundle = new $bundleClass(); 
     $bundle->getContainerExtension()->load(array(), $container); 
    } 

AvalancheImagineExtension/Resources/config/config.xml

<parameter key="imagine.bundle"></parameter> 

Por último, en su conjunto:

parameters: 
    imagine.filters: 
     image_main: 
      type: thumbnail 
      options: { size: [490, 310], mode: outbound } 
+0

muy mala idea, la clase de extensión de ImagineBundle tendrá el método load() llamado dos veces: una por contenedor y otra por código – adamziel

Cuestiones relacionadas