Comment récupérer les paramètres de configuration dans un contrôleur en Symfony?

J’ai placé quelques variables personnalisées dans mon fichier app/config/parameters.yml.

parameters:
    api_pages: 25
    api_posts: 80

J’ai besoin d’y accéder à partir de mon contrôleur, et j’ai essayé de les récupérés avec

$this->get('api_pages');

à partir de mon contrôleur. Lorsque j’essaie de le faire, j’obtiens ce message d’erreur :

You have requested a non-existent service « api_pages ».

Du coup comment je peux lire le fichier parameters.yml dans un contrôleur en symfony?

Dans Symfony 2.6 et les versions antérieures, pour récupérer un paramètre dans un contrôleur - vous devez d’abord récupérer le conteneur, et ensuite - le paramètre.

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

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

Dans Symfony 2.7 et les versions plus récentes, pour récupérer un paramètre dans un contrôleur, vous pouvez utiliser le code suivant :

$this->getParameter('api_pages');

A partir de Symfony 3.3 + 3.4, il existe une méthode beaucoup plus propre, facile à configurer et à utiliser.

Au lieu d’utiliser le conteneur et le localisateur de service/paramètre, vous pouvez passer des paramètres à la classe via son constructeur. Ne vous inquiétez pas, il ne s’agit pas d’un travail fastidieux, mais plutôt d’une approche consistant à configurer une fois et à oublier.

Etape 1: Dans le fichier app/config/services.yml

# config.yml
parameters:
    api_pages: 25
    api_posts: 80

services:
    _defaults:
        autowire: true
        bind:
            $apiPages: '%api_pages%'
            $apiPosts: '%api_posts%'

Etape 2: Dans le fichier app/config/services.yml

final class MyController extends SymfonyController
{
    /**
     * @var integer
     */
    private $apiPages;

    /**
     * @var integer
     */
    private $apiPosts;

    public function __construct(string $apiPages, string $apiPosts)
    {
        $this->apiPages = $apiPages;
        $this->apiPosts = $apiPosts;
    }

    public function registerAction(): void
    {
        var_dump($this->apiPages); // "api_pages"
        var_dump($this->apiPosts); // "api_posts"
    }
}

Dans Symfony 4, vous pouvez utiliser l’interface ParameterBagInterface :

use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;

class Param
{
    private $params;

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

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

Et dans le fichier app/config/services.yaml :

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