Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Configurando un bundle reutilizable

24 de octubre de 2015

Hola buenas,

Quisiera configurar un bundle a través del archivo config.yml, donde podré activar funcionalidades según necesidades.

Por ejemplo: Un bundle que su función es visualizar información de la request en el log. Por ahora tengo una sola funcionalidad que deseo activar o desactivar desde config.yml

App/config/config.yml

#InfoLogBundle
info_log:
    user_agent: true

He configurado el archivo DependencyInjection/Configuration.php para validar los datos con el componente Config

En el archivo DependencyInjection/[mialias]Extension.php cargo el archivo de servicios. LA DUDA es que no sé como manejar la cargar solo de algunos servicios del archivo MiBundle/Resources/config/services.yml y no todos, tal como está ahora.

No sé si se podrá realizar así, los ejemplos que he visto solo cargan o no cargan el archivo services.yml al completo.

¿Alguna sugerencia?

Muchas gracias!


Respuestas

#1

Cuando tus servicios son dinámicos, puedes hacerlo de dos maneras:

  1. Definir la mayoría de ellos en el archivo services.xml normal y luego manipular lo que haga falta (eliminarlos, cambiarles de nombre, pasarles parámetros, etc.)
  2. No crear ese archivo services.xml y definir todos los servicios dinámicamente dentro de la extensión del contenedor de inyección de dependencias.

Si tus servicios son poco dinámicos, usa la opción 1 porque te ahorrará trabajo. Si no, usa la opción 2.

En cuanto a cómo se hace eso, léete el artículo Working with Container Service Definitions porque es exactamente lo que tienes que hacer. En vez de definir servicios en un archivo XML/YAML, tienes que crear "definiciones de servicios" usando PHP. Es más fácil de lo que puede parecer en un principio.

En el archivo FrameworkExtension.php del FrameworkBundle puedes ver muchos ejemplos de cómo se usan las definiciones en la práctica.

@javiereguiluz

24 octubre 2015, 15:30
#2

Muchas gracias Javier, ya me funciona.

He utilizado la 1º opción, y quedaría así:

//InfoLogBundle\DependencyInjection\InfoLogExtension.php
 
public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);
 
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');
 
        if(!$config['user_agent']) {
            $container->removeDefinition('info_log.user_agent_subscriber');
        }
    }

Gracias =)

@JuanluGarciaB

24 octubre 2015, 19:18