web-dev-qa-db-fra.com

Comment lire depuis parameters.yml dans un contrôleur sous symfony2?

J'ai mis quelques variables personnalisées dans mon application/config/parameters.yml.

parameters:
    api_pass: apipass
    api_user: apiuser

J'ai besoin d'y accéder depuis mon contrôleur et j'ai essayé de les récupérer avec

$this->get('api_user');

à partir de mon fichier de contrôleur. Quand j'essaye ceci, j'obtiens ce message d'erreur:

You have requested a non-existent service "api_user".

Quelle est la bonne façon de faire cela?

133
Bohr

Dans Symfony 2.6 et versions antérieures, pour obtenir un paramètre dans un contrôleur, vous devez d'abord obtenir le conteneur, puis le paramètre requis.

$this->container->getParameter('api_user');

Ce chapitre de documentation l'explique.

Alors que la méthode $this->get() dans un contrôleur chargera un service ( doc )

Dans Symfony 2.7 et les versions plus récentes, vous pouvez utiliser les éléments suivants pour obtenir un paramètre dans un contrôleur:

$this->getParameter('api_user');
280
Vitalii Zurian

La voie propre

Depuis 2017 et Symfony 3.3 + 3.4, il existe un moyen beaucoup plus propre - facile à installer et à utiliser.

Au lieu d'utiliser l'anti-modèle de conteneur et de localisateur de service/paramètre, vous pouvez transmettre des paramètres à class via son constructeur. Ne vous inquiétez pas, ce n’est pas un travail fastidieux, mais bien une configuration unique et l’oubli approche.

Comment le configurer en 2 étapes?

1. app/config/services.yml

# config.yml

# config.yml
parameters:
    api_pass: 'secret_password'
    api_user: 'my_name'

services:
    _defaults:
        autowire: true
        bind:
            $apiPass: '%api_pass%'
            $apiUser: '%api_user%'

    App\:
        resource: ..

2. Tout Controller

<?php declare(strict_types=1);

final class ApiController extends SymfonyController
{
    /**
     * @var string 
     */
    private $apiPass;

    /**
     * @var string
     */
    private $apiUser;

    public function __construct(string $apiPass, string $apiUser)
    {
        $this->apiPass = $apiPass;
        $this->apiUser = $apiUser;
    }

    public function registerAction(): void
    {
        var_dump($this->apiPass); // "secret_password"
        var_dump($this->apiUser); // "my_name"
    }
}

Mise à niveau instantanée prête!

Si vous utilisez une approche plus ancienne, vous pouvez l’automatiser avec Rector .

Lire la suite

C'est ce qu'on appelle l'approche constructeur injection over services locator.

Pour en savoir plus à ce sujet, consultez mon article Comment obtenir un paramètre propre à Symfony Controller .

(Il a été testé et je le garde à jour pour la nouvelle version majeure de Symfony (5, 6 ...)).

16
Tomáš Votruba

Je vous envoie un exemple avec swiftmailer:

paramètres.yml

recipients: [email1, email2, email3]

prestations de service:

your_service_name:
        class: your_namespace
        arguments: ["%recipients%"]

la classe du service:

protected $recipients;

public function __construct($recipients)
{
    $this->recipients = $recipients;
}
9
Gravitty

Dans Symfony 4, vous pouvez utiliser la variable ParameterBagInterface:

use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;

class MessageGenerator
{
    private $params;

    public function __construct(ParameterBagInterface $params)
    {
        $this->params = $params;
    }

    public function someMethod()
    {
        $parameterValue = $this->params->get('parameter_name');
        // ...
    }
}

et en app/config/services.yaml:

parameters:
    locale: 'en'
    dir: '%kernel.project_dir%'

Cela fonctionne pour moi dans les classes de contrôleur et de formulaire. Plus de détails peuvent être trouvés dans le blog de Symfony .

1
ghazaleh javaheri

Dans Symfony 4.3.1, j'utilise ceci:

services.yaml

HTTP_USERNAME: 'admin'
HTTP_PASSWORD: 'password123'

FrontController.php

$username = $this->container->getParameter('HTTP_USERNAME');
$password = $this->container->getParameter('HTTP_PASSWORD');
0
Achraf JEDAY

Vous pouvez utiliser:

public function indexAction()
{
   dump( $this->getParameter('api_user'));
}

Pour plus d'informations, je vous recommande de lire la doc:

http://symfony.com/doc/2.8/service_container/parameters.html

0
mrDjouk