Symfony 5
Twig
L'objectif de cet article est de vous aider à créer une fonction qui sera utilisable dans un template Twig.
Pour cela il nous faut avant tout créer une extension de Twig. Dans celle-ci nous auront la liste des fonctions disponible pour les templates.
Pour créer une extension de Twig nous allons utiliser une commande disponible dans Symfony 5. La commande est la suivante.
symfony console make:twig-extension
Dans notre exemple nous appelerons cette extension "TestExtention".
Un fichier est alors crée dans le dossier Twig lui-même crée dans le dossier src de notre projet.
Le fichier TestExtension se présente sous cette forme.
namespace App\Twig;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
use Twig\TwigFunction;
class TestExtension extends AbstractExtension
{
public function getFilters(): array
{
return [
// If your filter generates SAFE HTML, you should add a third
// parameter: ['is_safe' => ['html']]
// Reference: https://twig.symfony.com/doc/2.x/advanced.html#automatic-escaping
new TwigFilter('filter_name', [$this, 'doSomething']),
];
}
public function getFunctions(): array
{
return [
new TwigFunction('function_name', [$this, 'doSomething']),
];
}
public function doSomething($value)
{
// ...
}
}
Comme vous pouvez l'observer, il y a trois méthodes. L'une des méthodes (getFilter) concerne les filtres. Nous en rappelerons plus bas. La deuxième méthode (getFunctions) s'occupe des fonctions.
Dans le return de cette méthode nous pouvons placer les fonctions qui doivent être utilisé dans un template Twig. On associe cette fonction à une métode de la classe générée afin de lui attribuer des fonctionnalités et des résultats.
Dans notre exemple nous imaginons que nous souhaitons créer une fonction qui permet de retourner le nombre de caractère d'une chaîne de caratères.
public function getFunctions(): array
{
return [
new TwigFunction('nbre_chaine_de_caractere', [$this, 'nbre_caractere']),
];
}
public function nbre_caractere($value)
{
// Nous utilisons la fonction PHP strlen
// Elle renvoie le nombre de caratère d'un chaîne
return strlen($value);
}
{{ nbre_chaine_de_caractere('Henrique Rodrigues')}}
Le résultat est de 18 car le nom "Henrique Rodrigues" contient 18 caractères avec l'espace.
Pour les filtres il faut également créer une extension pour pouvoir les lister dans celle-ci. Le principe est le même que pour les fonctions.
Nous allons utliser le même exemple que pour la fonctions avec le même résultat mais fait d'un autre façon car cette fois-ci nous utiliserons un filtre.
public function getFilters(): array
{
return [
// If your filter generates SAFE HTML, you should add a third
// parameter: ['is_safe' => ['html']]
// Reference: https://twig.symfony.com/doc/2.x/advanced.html#automatic-escaping
new TwigFilter('nbre_chaine_de_caractere', [$this, 'nbre_caractere']),
];
}
public function nbre_caractere($value)
{
// Nous utilisons la fonction PHP strlen
// Elle renvoie le nombre de caratère d'un chaîne
return strlen($value);
}
{{ 'Henrique Rodrigues'|nbre_chaine_de_caractere }}
Le résultat est exactement le même que pour la fonction : 18.
On peut atteindre le même but avec un filtre ou une fonction. La seul différence réside sur la manière de procéder ou de traiter l'information dans le templa Twig.