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

Publié le 25/10/2019 • Actualisé 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 🇬🇧 Close

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ôleurs : requirements={"_locale"="%locales_requirements%"}


# config/snippets/49.yaml
parameters:
    type_article: !php/const App\DBAL\Types\ArticleType::TYPE_BLOG_POST
    type_snippet: !php/const App\DBAL\Types\ArticleType::TYPE_SNIPPET
    article_types: '%type_article%,%type_snippet%'
    # This parameter can be used in annotations or attributes for example
    article_requirements: '%type_article%|%type_snippet%'
En bonus, le snippet permettant d'utiliser ce code : 🎉
<?php

declare(strict_types=1);

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'.PHP_EOL, 'article_types', $this->getParameter('article_types'));
        echo sprintf('%s: %s', 'article_requirements', $this->getParameter('article_requirements'));

        // That's it! 😁
    }
}

 Exécuter le snippet  ≪ this.showUnitTest ? this.trans.hide_unit_test : this.trans.show_unit_test ≫  Plus sur Stackoverflow   Lire la doc  Snippet aléatoire

  Travaillez avec moi !

<?php

declare(strict_types=1);

namespace App\Tests\Integration\Controller\Snippets;

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

/**
 * @see Snippet49Trait
 */
final class Snippet49Test extends KernelTestCase
{
    protected function setUp(): void
    {
        self::bootKernel();
    }

    /**
     * @see Snippet49Trait::snippet49
     */
    public function testSnippet49(): void
    {
        $articleTypes = self::getContainer()->getParameter('article_types');
        $articleRequirements = self::getContainer()->getParameter('article_requirements');
        self::assertSame('blog_post,snippet', $articleTypes);
        self::assertSame('blog_post|snippet', $articleRequirements);
    }
}