[Symfony] Utiliser une constante applicative en tant que paramètre du conteneur de services

Publié le 25/10/2019 • Mis à jour le 25/10/2019

English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧

Parfois on a besoin d'accéder à une constante de l'application en tant que paramètre du conteneur de services. On peut utiliser directement la constante PHP. Mais si vous l'utilisez plusieurs fois, il peut être judicieux d'introduire un paramètre dans le conteneur afin de pouvoir l'utiliser plus facilement à d'autres endroits. Par exemple sur ce blog, j'utilise cette astuce pour injecter les prérequis de langue dans les annotations des contrôlleurs : requirements={"_locale"="%locales_requirements%"}


# config/snippets/49.yaml
parameters:
    type_article: !php/const App\Entity\ArticleTypeRepository::TYPE_ARTICLE
    type_snippet: !php/const App\Entity\ArticleTypeRepository::TYPE_SNIPPET
    article_types: '%type_article%,%type_snippet%'
    # This parameter can be used in annotations for example
    article_requirements: '%type_article%|%type_snippet%'
En bonus, le snippet permettant d'utiliser ce code : 🎉
<?php declare(strict_types=1);

// src/Controller/Snippet/Snippet49Trait.php

namespace App\Controller\Snippet;

/**
 * J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
 * Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
 * ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
 * Les services sont injectés dans le constructeur du contrôleur principal.
 */
trait Snippet49Trait
{
    public function snippet49(): void
    {
        echo sprintf('%s: %s'."\n", 'article_types', $this->getParameter('article_types'));
        echo sprintf('%s: %s', 'article_requirements', $this->getParameter('article_requirements'));
        // That's it! 😁
    }
}

 Exécuter le snippet  Plus sur Stackoverflow   Lire la doc