Laravel : Ajouter une extension personnalisée dans Twig

Le partage, c’est bien quand c’est utile :

Je viens d’être confronté à un problème sur Laravel et le bundle TwigBridge. La function link_to_route() n’existe pas si on en croit le message : The function "link_to_route" does not exist .... Après quelques recherche je suis tombé sur ce topic qui explique pourquoi cela ne fonctionne pas : Appeler une fonction helper dans notre vue sur Laravel 4.

Voici comment créer une extension pour Twig dans Laravel 4 qui nous permettra de rajouter les fonctions du helper proprement dans Twig.
Cette méthode est exactement la même pour ajouter des filtres à Twig.

1. Créer le fichier d’extension

Créez votre fichier d’extensions dans : app/extensions/twig/TwigFunctions.php :

<?php
namespace App\Extensions\Twig;

class TwigFunctions extends \Twig_Extension {
    //... functions implementation
}

2. Renseignez composer

Ajouter le dossier dans composer (autoload > classmap) pour le chargement automatique du classmap :

"autoload": {
    "classmap": [
        ...
        "app/extensions/twig",
        ...
    ]
},

Mettez à jour l’autoloader en lançant la commande : php composer.phar dump-autoload

3. Configuration de TwigBridge

Créez le fichier de configuration du bundle TwigBridge en lançant la commande suivante : php artisan config:publish rcrowe/twigbridge
Éditez le fichier de configuration app/config/packages/rcrowe/twigbridge/config.php généré précédemment pour y ajouter notre extension :

'extensions' => array(
    ...
    'App\Extensions\Twig\TwigFunctions',
    ...
)

Désormais toutes les fonctions définies dans cette classe seront directement disponibles dans nos vues Twig.

4. Bonus

Pour conclure voici mon fichier TwigFunctions.php, ça peux servir de base.

<?php
namespace App\Extensions\Twig;

/**
 * Description of TwigFunctions
 *
 * @author Alexandre Clain
 */
class TwigFunctions extends \Twig_Extension {

    public function getFunctions() {
        return array(
            new \Twig_SimpleFunction('link_to_route', array($this, 'link_to_route')),
        );
    }

    public function link_to_route($route, $title, $parameters = array(), $attributes = array()) {
        return link_to_route($route, $title, $parameters, $attributes);
    }

    public function getName() {
        return 'AclaTwigFunctions';
    }
}

N’hésitez pas à lire cette documentation de Twig qui est très bien faite malgré le faite qu’elle soit pour Symfony2 à la base : http://symfony.com/doc/current/cookbook/templating/twig_extension.html.

Source : http://stackoverflow.com/questions/16415778/how-to-use-custom-twig-functions-in-laravel-using-twigbridge.

Le partage, c’est bien quand c’est utile :