Azur Web
Henrique Rodrigues
Développeur Web

Créer et utiliser une fonction ou un filtre personnalisé dans Twig

Symfony 5

Twig

Créer une fontion Twig personnalisé

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.

Twig Extension

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)
    {
        // ...
    }
}

Décortiquer le fichier

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.

Exemple d'utilisation d'une fonction Twig

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.

Ajouter une fonction à l'extension

    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);
    }

Template Twig

{{ nbre_chaine_de_caractere('Henrique Rodrigues')}}

Résultat de la fonction

Le résultat est de 18 car le nom "Henrique Rodrigues" contient 18 caractères avec l'espace.

Création d'un filtre Twig

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.

Exemple d'utilisation d'un filtre

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.

Ajouter un filtre à l'extension

    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);
    }

Template Twig pour le filtre

{{ 'Henrique Rodrigues'|nbre_chaine_de_caractere }}

Résultat du filtre

Le résultat est exactement le même que pour la fonction : 18.

Différence entre une fonction et un filtre

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.

Email
Cela ne fontionne pas.