yml subversion migrations symfony configuration

subversion - symfony migrations



¿Cómo leo la configuración de Symfony2 config.yml? (6)

Aprendí de una manera fácil del ejemplo de código de http://tutorial.symblog.co.uk/

1) observe el ZendeskBlueFormBundle y la ubicación del archivo

# myproject/app/config/config.yml imports: - { resource: parameters.yml } - { resource: security.yml } - { resource: @ZendeskBlueFormBundle/Resources/config/config.yml } framework:

2) aviso de Zendesk_BlueForm.emails.contact_email y la ubicación del archivo

# myproject/src/Zendesk/BlueFormBundle/Resources/config/config.yml parameters: # Zendesk contact email address Zendesk_BlueForm.emails.contact_email: [email protected]

3) observe cómo lo obtengo en $ client y la ubicación del archivo del controlador

# myproject/src/Zendesk/BlueFormBundle/Controller/PageController.php public function blueFormAction($name, $arg1, $arg2, $arg3, Request $request) { $client = new ZendeskAPI($this->container->getParameter("Zendesk_BlueForm.emails.contact_email")); ... }

He agregado una configuración a mi archivo config.yml como tal:

app.config: contact_email: [email protected] ...

Por mi vida, no puedo entender cómo leerlo en una variable. Intenté algo como esto en uno de mis controladores:

$recipient = $this->container->getParameter(''contact_email'');

Pero me sale un error que dice:

El parámetro "contact_email" debe estar definido.

Borré mi caché, también busqué en todos lados en la documentación del sitio recargo Symfony2, pero no puedo encontrar cómo hacerlo.

Probablemente demasiado cansado para resolver esto ahora. ¿Alguien puede ayudarme con esto?



En lugar de definir contact_email dentro de app.config , app.config en una entrada de parameters :

parameters: contact_email: [email protected]

Debería encontrar que la llamada que está haciendo dentro de su controlador ahora funciona.


Mientras que la solución de mover el contact_email a parameters.yml es fácil, como se propone en otras respuestas, que puede desordenar fácilmente el archivo de parámetros si maneja muchos paquetes o si maneja bloques de configuración anidados.

  • Primero, responderé estrictamente la pregunta.
  • Más adelante, daré un enfoque para obtener esas configuraciones de los servicios sin pasar por un espacio común como parámetros.

PRIMER ENFOQUE: Bloque de configuración separado, obteniéndolo como parámetro

Con una extensión ( más sobre extensiones aquí ) puede mantener esto fácilmente "separado" en diferentes bloques en config.yml y luego inyectar eso como un parámetro gettable desde el controlador.

Dentro de su clase de extensión dentro del directorio DependencyInjection , escriba esto:

class MyNiceProjectExtension extends Extension { public function load( array $configs, ContainerBuilder $container ) { // The next 2 lines are pretty common to all Extension templates. $configuration = new Configuration(); $processedConfig = $this->processConfiguration( $configuration, $configs ); // This is the KEY TO YOUR ANSWER $container->setParameter( ''my_nice_project.contact_email'', $processedConfig[ ''contact_email'' ] ); // Other stuff like loading services.yml }

Luego en su config.yml, config_dev.yml y así puede establecer

my_nice_project: contact_email: [email protected]

Para poder procesar ese config.yml dentro de su MyNiceBundleExtension , también necesitará una clase de Configuration en el mismo espacio de nombres:

class Configuration implements ConfigurationInterface { public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root( ''my_nice_project'' ); $rootNode->children()->scalarNode( ''contact_email'' )->end(); return $treeBuilder; } }

Luego puede obtener la configuración de su controlador, tal como lo desea en su pregunta original, pero manteniendo los parameters.yml config.yml limpios y configurándolo en config.yml en secciones separadas:

$recipient = $this->container->getParameter( ''my_nice_project.contact_email'' );

SEGUNDO ENFOQUE: bloque de configuración separado, inyectando la configuración en un servicio

Para los lectores que buscan algo similar, pero para obtener la configuración de un servicio, existe incluso una manera más agradable que nunca ocupa el espacio común de los "parámetros" e incluso no necesita que el container pase al servicio (pasar todo el contenedor es práctica para evitar).

Este truco anterior aún "inyecta" en los parámetros de espacio de su configuración.

Sin embargo, después de cargar su definición del servicio, puede agregar una llamada a un método, como por ejemplo setConfig() que inyecte ese bloque solo al servicio.

Por ejemplo, en la clase de Extensión:

class MyNiceProjectExtension extends Extension { public function load( array $configs, ContainerBuilder $container ) { $configuration = new Configuration(); $processedConfig = $this->processConfiguration( $configuration, $configs ); // Do not add a paramater now, just continue reading the services. $loader = new YamlFileLoader( $container, new FileLocator( __DIR__ . ''/../Resources/config'' ) ); $loader->load( ''services.yml'' ); // Once the services definition are read, get your service and add a method call to setConfig() $sillyServiceDefintion = $container->getDefinition( ''my.niceproject.sillymanager'' ); $sillyServiceDefintion->addMethodCall( ''setConfig'', array( $processedConfig[ ''contact_email'' ] ) ); } }

Luego, en su services.yml define su servicio como de costumbre, sin ningún cambio absoluto:

services: my.niceproject.sillymanager: class: My/NiceProjectBundle/Model/SillyManager arguments: []

Y luego, en su clase SillyManager , simplemente agregue el método:

class SillyManager { private $contact_email; public function setConfig( $newConfigContactEmail ) { $this->contact_email = $newConfigContactEmail; } }

Tenga en cuenta que esto también funciona para matrices en lugar de valores escalares. Imagine que configura una cola de conejos y necesita un host, usuario y contraseña:

my_nice_project: amqp: host: 192.168.33.55 user: guest password: guest

Por supuesto, necesitas cambiar tu árbol, pero puedes hacerlo:

$sillyServiceDefintion->addMethodCall( ''setConfig'', array( $processedConfig[ ''amqp'' ] ) );

y luego en el servicio hacer:

class SillyManager { private $host; private $user; private $password; public function setConfig( $config ) { $this->host = $config[ ''host'' ]; $this->user = $config[ ''user'' ]; $this->password = $config[ ''password'' ]; } }

¡Espero que esto ayude!



Tengo que agregar a la respuesta de douglas, puedes acceder a la configuración global, pero Symfony traduce algunos parámetros, por ejemplo:

# config.yml ... framework: session: domain: ''localhost'' ...

son

$this->container->parameters[''session.storage.options''][''domain''];

Puede usar var_dump para buscar una clave o valor especificado.