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

¿Cómo usar parámetros para mi propio bundle?

16 de diciembre de 2015

Hola, estoy aprendiendo a crear un bundle reutilizable y tengo una duda.

He visto que muchos bundles incluyen su propia configuración en el archivo config.yml. por ejemplo:

mi_bundle:
    mi_variable: valor

Quisiera, por ejemplo, poder acceder al valor de mi variable para usarla, por ejemplo, en el controlador de mi bundle. ¿Cómo podría hacerlo? He llegado hasta la parte donde en donde en el archivo DependencyInjection/Configuration.php, configuro:

$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('mi_bundle');
 
$rootNode
    ->children()
        ->scalarNode('mi_variable')->end()
    ->end()
;

¿Qué más debo hacer para poder acceder al valor de mi_variable en cualquier Controlador?


Respuestas

#1

De momento vas bien, pero te falta algo más de código para cargar la configuración en el contenedor de servicios de Symfony y así hacer que esté disponible desde cualquier lugar (por ejemplo desde los controladores).

El artículo oficial que explica paso a paso cómo hacerlo es este: How to Create Friendly Configuration for a Bundle.

Si quieres ver un ejemplo concreto, en el único bundle que he creado yo mismo, tengo un ejemplo de cómo hacerlo. Primero creo la clase Configuration.php tal y como has hecho tu. Y después creo la clase de tipo extensión. El funcionamiento es el siguiente:

  1. Gracias al archivo Configuration.php, Symfony puede saber si la configuración definida por el usuario es correcta. Además de validar, puedes normalizar y hacer cosas muy avanzadas con al configuración antes de que llegue a tu código.
  2. Una vez que todo es correcto, Symfony le pasa la configuración procesada a tu clase *Extension. Ahí puedes procesar de manera avanzada la configuración inicial del usuario. Normalmente, en esta clase lo que haces es crear/modificar/eliminar servicios o parámetros del contenedor.

En el ejemplo que te mostraba antes de mi bundle, la clave está en esta línea. Aunque la clase *Extension es muy compleja, lo único que hago es procesar todo lo que me dan y crear un parámetro en el contenedor, que es justo lo que hace esa línea de código.

Cuando crees tu clase *Extension, si tienes más dudas pregúntanos porque este tema es muy avanzado, pero a la vez bastante difícil de entender bien a la primera.

@javiereguiluz

16 diciembre 2015, 19:29
#2

Ha estado genial. He puesto en el *Extension:

$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);
 
$container->setParameter('mibundle.config', $config);

Y ahora puedo usar el $this->container->getParameter() para obtener los valores. Problema resuelto y muchas gracias

@SakyaStelios

17 diciembre 2015, 4:38
#3

¡Genial! De todas formas, recuerda que este ejemplo es lo más sencillo que se puede hacer. Dentro del *Extension.php puedes también crear servicios, deshabilitar otros (en función de lo que haya configurado el usuario o en función de otras condiciones, etc.) Para aprender esos usos avanzados, lo mejor es abrir la clase *Extension de algún bundle popular.

@javiereguiluz

17 diciembre 2015, 8:16