PRÉSENTATION DU COURS

Twig : Moteur de template de symfony

Installer et utiliser twig avec symfony

Moteur de template ?

Le moteurs de template sont des programmes permettant de super charger le html de fonctionnalités supplémentaires.

Ce sont des choses que nous pourrions faire directement en php, mais avoir un moteur de template éprouvé qui vient avec tout un tas de fonctionnalités très utile c'est toujours du temps de gagner !

Dans vos controller vous n'êtes pas obligé de renvoyer du html ou le résultat d'un moteur de template, la seule rêgle étant que vous renvoyiez une instance de la classe Response de Symfony

Twig n'est pas le seul moteur de template que vous pouvez installer sur Symfony, mais c'est celui que vous retrouverez dans 99% des projets symfony

Twig

Vous pouvez retrouver la documentation de twig sur le site twig.symfony.com

Installer twig

Pour installer twig, nous allons utiliser une receipe de symfony (Vous pouvez d'ailleurs la retrouver sur le site symfony.sh)

Ouvrez votre terminal, allez dans votre projet et tapez la commande suivante :

composer require twig

Et hop twig est installé !

Par contre, l'installation du paquet a modifié quelques fichiers, allons voir à quoie ça correspond.

Fichier config/bundle.php

Dans ce fichier l'installation a ajouté cette ligne là :

Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],

Qu'est ce que c'est et à quoi ça sert ?

Symfony utilise un systme de plugins qu'ils décrivent comme "Bundles", cest bundles sont fait par symfony, ou des membres de la communautés et permettent d'étendre le fonctionnement du framework.

Pour symfony 4 ces bundles sont principalement installés par les receipes, comme ça a été le cas pour notre moteur de template twig.

Fichier config/packages/twig.yaml

twig:
    paths: ['%kernel.project_dir%/templates']
    debug: '%kernel.debug%'
    strict_variables: '%kernel.debug%'

Ce fichier contient la configuration de twig, d'ailleurs ici, on peut voir que les templates que nous allons utilisé sont dans le chemin /templates au sein de notre projet, nous y reviendrons un peu plus tard.

Pour l'instant ne vous occupez pas des %kernel.qqchose%, ce sont des variables de configuration globales pour le framwork, nous y reviendrons plus tard dans ce cours. (Mais si vous avez un peu de nez, vous aurez compris que %kernel.project_dir% se réfères au dossier racine du projet)

Même si certains fichiers sont crées par des receipes, vous pouvez toujours les modifier, vous pouvez par exemple très bien renommer "templates" en "views" si cela vous enchante (à condition de renommer le dossier template dans votre projet hein)

Utiliser twig dans notre projet

Bon, maintenant que nous avons installé twig, nous allons l'utiliser dans notre controller !

Avant de faire ça, il va falloir changer quelques petites choses.

Tout d'abord, étendons notre controller avec la classe abstract controller

<?php

namespace App\Controller; 

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; // Nouveau use pour importer l'abstract controller

class ExempleController extends AbstractController
{
    /**
    * @Route("/")
    **/
    public function index() {
        return new Response('Hello world !'); 
    }
}

Vous n'êtes pas obligé d'étendre tous vos controllers par des abstract controller, mais ça nous ajoute pas mal de bénéfices plutôt sympa !

Désormais dans notre controller nous allons pour utiliser des méthodes shortcut, pour facilement utiliser twig

Maintenant vous pouvez désormais renvoyer un template :

<?php

namespace App\Controller; 

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; // Nouveau use pour importer l'abstract controller

class ExempleController extends AbstractController
{
    /**
    * @Route("/")
    **/
    public function index() {
        return $this->render('index.html.twig', []);
    }
}

La méthode render prends deux argument :

  1. Le nom du template à utiliser
  2. Un tableau de paramètres à faire passer à la vue

Bien sur vous pouvez avoir des templates qui sont dans des sous dossier, il suffit simplement de le référencer dans la partie template du render, exemple : article/detail.html.twig

Si on l'utilise pour afficher un titre dynamique :

<?php

namespace App\Controller; 

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; // Nouveau use pour importer l'abstract controller

class ExempleController extends AbstractController
{
    /**
    * @Route("/")
    **/
    public function index() {
        return $this->render('index.html.twig', [
            'title' => 'hello world'
        ]);
    }
}

N'essayez pas encore votre route, nous n'avons pas encore créé le template

Allez dans le dossier templates de votre projet (Si vous ne l'avez pas, c'est que vous n'avez pas installer twig)

Créez ensuite un nouveau fichier index.html.twig avec à l'intérieur :

<h1>{{ title }}</h1>

Si vous lancez votre route, une page avec du texte en gros devrait s'afficher. Ici twig a fait son travail et a remplacer la variable title par le titre que nous avons fait passé en paramètre !

Bravo, vous avez intégrer avec succès twig dans votre projet !

Bases de twig

Voilà quelques principes pour vous aider à aborder twig. Rassurez vous, c'est un moteur de template très accessible, si vous en avez déjà utilisé auparavant, vous serez loin d'être perdu !

Afficher des variable

Pour afficher des variable, il suffit de faire comme nous avons fait avec title précédement, en utilisant la synthaxe

{{ variable }}

Vous pouvez donc mettre ça au milieu de n'importe quelle basite HTML et twig s'occupe de l'afficher pour vous !

Utiliser des operateurs logiques

Pour utiliser des operateurs logiques tels que if ou for, vous pouvez utiliser la synthaxe suivante :

{% for item in things %}
    // votre code html
{% endfor %}

{% if item.property is defined %}
    // sera exécuté seulement si le if est considéré comme valide
{% endif %}

La boucle for ci dessus things doit être un tableau, et item sera remplit à chaque itération de la valeur courrante, comme dans une boucle foreach !

Commenter

Vous vous en doutez, les commentaires html ne marcherons pas pour commenter des variables

Vous pouvez donc utiliser la synthaxe suivante :

    {# {% if item.propery is defined %} #} // ne sera pas pris en en compte

Filtres

Autre aspect pratique de twig, les filtres ! Ce sont des choses assez pratiques pour afficher différentes choses de la variables, ou même encore formater / transformer le résultat

exemples :

 <h1>{{ title | length }}</h1> // donnera  la longeur de la chaine de caractère

 <h1>{{ title | upper }}</h1> // Title sera en uppercase

 //... et bien plus encore

Pour voir tous les filtres que propose twig, je vous invite à aller voir sur la documentation de twig (Non réélement faites le, c'est important de savoir ce qui est disponible)

Templates parent enfant

Avec Twig, il est possible de définir des tempates qui utilisent d'autres comme base, ce qui permet de simplifier le template (Pas besoin de mettre la base du html dans tous ses fichiers, on peut avoir le menu directement sur toutes les pages, et ça seulement avec un peu d'extension de templates)

Pour hériter d'un template avec twig, il faut utiliser cette synthaxe :

{% extends 'base.html.twig' %}

Ces éléments sont généralement mis en début du fichier twig, nous devons aussi référencer le nom du template (C'est pas magique non plus hein)

Une fois que vous avez importé le template vous avez accès à tous les blocs du parent !

Blocs

Les blocs sont des éléments où les enfants du template vont pouvoir venir injecter du code html

Ils se forment sous la forme suivante (Pris depuis le fichier base.html.twig, automatiquement ajouté à l'installation de twig):

{% block title %}Welcome!{% endblock %}

Alors qu'est ce que ça fait ?

Ici est déclaré un bloc avec le nom title, celui ci va pouvoir être utilisé par les enfants pour venir override la valeur Welcome! à l'intérieur. Dans le cas où personne n'utilise ce bloc, la valeur définie est choisie par défaut.

OK très bien, mais comment on l'utilise dans un template enfant ?

Très simplement de la même manière !

{% extends 'base.html.twig' %}

{% block title} title from child ! {% endblock %}

vous pouvez mettre des valeur texte, du html, css, js dans ces blocs, il faut juste que cela corersponde à du twig / html valide !

Bien sur ces blocs sont complétement personnalisables, vous pouvez en créer, les modifier, changer leur nom, les déplacer, vous êtes libre de tout 😎

Exemple avec notre template

{# '/template/base.html.twig' #}

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %}{% endblock %}
    </head>
    <body>
        {% block body %}{% endblock %}
        {% block javascripts %}{% endblock %}
    </body>
</html>
{# '/template/index.html.twig' #}

{% extends 'base.html.twig' %}

{% block title %}Homepage !{% endblock %}

{% block body %}
    <h1>{{ title }}</h1>
{% endblock %}

Et hop, de cette manière là, vous pouvez facilement créer des templates simples et modulaires !

Pour des petites applications ça peut vous sembler peu important, mais tôt ou tard le petit projet devient grand, il est donc important d'avoir les bons réflexes dès le début.

Utiliser les templates modulaires dès le début est un bon réflexe et une bonne habitude à prendre, et vous éviteras de perdre du temps à tout refaire lorsque ce sera necessaire.

Conclustion

Très bien, maintenant que vous êtes des experts twig, nous allons pouvoir passer à la suite !

N'oubliez pas, en cas de doute allez sur la documenation de twig

Envie de discuter du contenu ?

logo twitter @GarnierKristen