191 votes

Comment lire les paramètres de configuration à partir de Symfony2 config.yml?

J'ai ajouté un paramètre à ma config.fichier yml comme suit:

app.config:
    contact_email: somebody@gmail.com
    ...

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

$destinataire = $this->conteneur->getParameter('contact_email');

Mais j'obtiens un message d'erreur disant:

Le paramètre "contact_email" doit être défini.

J'ai effacé le cache de mon navigateur, j'ai aussi regardé un peu partout sur la Symfony2 reloaded site de la documentation, mais je ne trouve pas comment faire cela.

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

194voto

Douglas Greenshields Points 1551

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

 parameters:
    contact_email: somebody@gmail.com
 

Vous devriez trouver l'appel que vous faites au sein de votre contrôleur fonctionne maintenant.

171voto

Xavi Montero Points 1791

Tandis que la solution de déplacement de l' contact_email de parameters.yml est facile, comme proposé dans d'autres réponses, qui peuvent facilement nuire à votre fichier de paramètres si vous faites affaire avec de nombreux faisceaux ou si vous faites affaire avec des blocs imbriqués de configuration.

  • Tout d'abord, je vais répondre strictement à la question.
  • Plus tard, je vais vous donner une approche pour l'obtention de ces configs de services sans jamais passer par l'intermédiaire d'un espace commun en tant que paramètres.

PREMIÈRE APPROCHE: Séparée config bloc, en tant que paramètre

Avec une extension que vous pouvez garder cette facilement "séparés" dans les différents blocs dans l' config.yml puis injecter que comme un paramètre get à partir du contrôleur.

À l'intérieur de votre classe d'Extension à l'intérieur de l' DependencyInjection annuaire écrire 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
    }

Puis dans votre config.yml, config_dev.yml et de sorte que vous pouvez définir

my_nice_project:
    contact_email: someone@example.com

Pour être en mesure de traiter que config.yml à l'intérieur de votre MyNiceBundleExtension vous aurez également besoin d'un Configuration de la classe 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 désirez dans votre question initiale, mais en gardant l' parameters.yml propre, et le mettre dans l' config.yml dans des sections séparées:

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

DEUXIÈME APPROCHE: Séparée config bloc, l'injection de la config dans un service

Pour les lecteurs à la recherche de quelque chose de semblable, mais aussi pour la config d'un service, il n'est même plus agréable que jamais encombre les "paramètres" de l'espace commun et n'a même pas besoin de l' container à être passés au service (en passant de l'ensemble du conteneur est une pratique à éviter).

Cette astuce ci-dessus "injecte" dans les paramètres de l'espace de votre config.

Néanmoins, après le chargement de votre définition du service, vous pouvez ajouter une méthode à l'appel comme, par exemple, setConfig() qui injecte de ce bloc que pour le service.

Par exemple, dans la classe d'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' ] ) );
    }
}

Puis dans votre services.yml vous définissez votre service comme d'habitude, sans aucune variation absolue:

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

Et puis dans votre SillyManager classe, il suffit d'ajouter la méthode:

class SillyManager
{
    private $contact_email;

    public setConfig( $newConfigContactEmail )
    {
        $this->contact_email = $newConfigContactEmail;
    }
}

Notez que cela fonctionne aussi pour les tableaux à la place de valeurs scalaires! Imaginez que vous configurez un lapin file d'attente et le besoin de l'hôte, utilisateur et mot de passe:

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

Bien sûr, vous avez besoin de changer votre Arbre, mais vous pouvez le faire:

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

et puis dans le service:

class SillyManager
{
    private $host;
    private $user;
    private $password;

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

Espérons que cette aide!

34voto

Felipe Alcacibar Points 4822

Je dois ajouter à la réponse de douglas, vous pouvez accéder à la configuration globale, mais symfony traduit certains paramètres, par exemple :

sont

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

17voto

Nikola Petkanski Points 1197

Afin d’être en mesure d’exposer certains paramètres de configuration pour votre forfait, vous devez consulter la documentation pour le faire. Il est assez facile à faire  :)

Voici le lien : comment exposer une Configuration sémantique pour un Bundle

7voto

Comme il a été dit précédemment -, vous pouvez accéder à tous les paramètres au moyen d’injection et utilisez sa propriété de paramètre.

« Symfony – travailler avec conteneur Service Definitions » est un bon article à ce sujet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X