[Symfony] Utiliser une constante applicative en tant que paramètre du conteneur de services
Publié le 25/10/2019 • Actualisé le 25/10/2019
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
<?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);
}
}