Comment lire les parameters de configuration de Symfony2 config.yml?

J’ai ajouté un paramètre à mon fichier config.yml en tant que tel:

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

Pour la vie de moi, je ne peux pas comprendre comment le lire dans une variable. J’ai essayé quelque chose comme ça dans l’un de mes contrôleurs:

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

Mais j’ai une erreur en disant:

Le paramètre “contact_email” doit être défini.

J’ai effacé mon cache, j’ai aussi regardé partout sur la documentation du site Symfony2 rechargé, mais je ne trouve pas comment faire.

Probablement juste trop fatigué pour comprendre cela maintenant. Quelqu’un peut-il aider avec cela?

Plutôt que de définir contact_email dans app.config , définissez-le dans une entrée de parameters :

 parameters: contact_email: [email protected] 

Vous devriez trouver l’appel que vous effectuez dans votre contrôleur fonctionne maintenant.

Bien que la solution contact_email à déplacer contact_email vers parameters.yml soit facile, comme cela est proposé dans d’autres réponses, cela peut facilement encombrer votre fichier de parameters si vous traitez de nombreux bundles ou si vous traitez des blocs de configuration nesteds.

  • Premièrement, je répondrai ssortingctement à la question.
  • Plus tard, je donnerai une approche pour obtenir ces configurations à partir de services sans jamais passer par un espace commun en tant que parameters.

PREMIÈRE APPROCHE: Bloc de configuration séparé, obtenant comme paramètre

Avec une extension ( plus sur les extensions ici ), vous pouvez garder cela facilement “séparé” dans différents blocs du config.yml , puis injecter cela comme paramètre mémorisable dans le contrôleur.

Dans votre classe Extension dans le répertoire DependencyInjection , écrivez ceci:

 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 } 

Ensuite, dans votre config.yml, config_dev.yml et ainsi vous pouvez définir

 my_nice_project: contact_email: [email protected] 

Pour pouvoir traiter ce MyNiceBundleExtension config.yml dans votre MyNiceBundleExtension vous aurez également besoin d’une classe de Configuration dans le même espace de noms:

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

Ensuite, vous pouvez obtenir la configuration de votre contrôleur, comme vous le souhaitiez dans votre question originale, mais en gardant les parameters.yml propres et en les configurant dans le config.yml dans des sections séparées:

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

SECOND APPROACH: Bloc de configuration séparé, injectant la configuration dans un service

Pour les lecteurs à la recherche de quelque chose de similaire mais pour obtenir la configuration d’un service, il existe même une manière plus agréable de ne jamais encombrer l’espace commun des “paramaters” et même de ne pas transmettre le container au service (passer le conteneur entier est pratique) éviter).

Cette astuce ci-dessus “injecte” encore dans les parameters de l’espace de votre configuration.

Néanmoins, après avoir chargé votre définition du service, vous pouvez append un appel de méthode comme par exemple setConfig() qui injecte ce bloc uniquement au service.

Par exemple, dans la classe Extension:

 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' ] ) ); } } 

Ensuite, dans vos services.yml vous définissez votre service comme d’habitude, sans aucun changement absolu:

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

Et puis, dans votre classe SillyManager , ajoutez simplement la méthode:

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

Notez que cela fonctionne également pour les tableaux au lieu des valeurs scalaires! Imaginez que vous configurez une queue de lapin et que vous ayez besoin d’un hôte, d’un utilisateur et d’un mot de passe:

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

Bien sûr, vous devez changer votre arbre, mais vous pouvez alors:

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

et puis dans le service faire:

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

J’espère que cela t’aides!

Je dois append à la réponse de Douglas, vous pouvez accéder à la configuration globale, mais symfony traduit certains parameters, par exemple:

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

sont

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

Vous pouvez utiliser var_dump pour rechercher une clé ou une valeur spécifiée.

Afin de pouvoir exposer certains parameters de configuration pour votre bundle, consultez la documentation pour le faire. C’est assez facile à faire 🙂

Voici le lien: Comment exposer une configuration sémantique pour un ensemble

Comme il le disait précédemment, vous pouvez accéder à tous les parameters en utilisant un conteneur d’injection et utiliser sa propriété de paramètre.

“Symfony – Travailler avec des définitions de service de conteneur” est un bon article à ce sujet.

J’ai appris facilement à partir de l’exemple de code de http://tutorial.symblog.co.uk/

1) remarquez l’emplacement de ZendeskBlueFormBundle et du fichier

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

2) notez Zendesk_BlueForm.emails.contact_email et l’emplacement du fichier

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

3) remarquez comment je l’obtiens dans le client $ et l’emplacement du fichier du contrôleur

 # 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")); ... }