Twig
Présentation de la bibliothèque
Twig est un moteur de templates pour PHP, qui permet de séparer la logique de votre code de sa présentation. C'est une pratique courante en développement Web pour rendre le code plus lisible et maintenable.
Dans une architecture MVC (Modèle-Vue-Contrôleur), Twig serait utilisé pour la partie "Vue". Il permet d'afficher des variables, de faire des boucles, des conditions, et même d'hériter d'autres templates.
Pour installer la bibliothèque Twig, nous ferons appel à Composer (que nous avons étudié dans le tutoriel sur Composer).
Voici la commande pour installer Twig avec Composer :
composer require twig/twig
Ensuite, vous pouvez créer une instance de Twig et afficher un template :
$loader = new \Twig\Loader\FilesystemLoader('/path/to/templates');
$twig = new \Twig\Environment($loader);
echo $twig->render('index.html', ['name' => 'Miss Fortune']);
Dans cet exemple, index.html
est un fichier de template Twig qui pourrait ressembler à ceci :
<!DOCTYPE html>
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h1>Welcome, {{ name }}!</h1>
</body>
</html>
Il existe deux types de délimiteurs : {{ ... }}
et {% ... %}
:
- le délimiteur
{{ ... }}
affiche le résultat d'une variable ou d'une expression. - le délimiteur
{% ... %}
exécute des instructions telles que les boucles "for"
Variables
Le contrôleur transmet des variables au template.
Avec Twig, il suffit d'utiliser un point (.) pour accéder aux attributs d'une variable (propriétés ou méthodes d'un objet PHP, ou éléments d'un tableau PHP) :
{{ user.name }}
Les filtres
Les variables peuvent être modifiées par des filtres.
Les filtres sont séparés de la variable par un symbole de pipe (|
).
L'exemple suivant supprime toutes les balises HTML du nom et met le texte en majuscules :
{{ name|striptags|title }}
Consultez la documentation sur les filtres Twig pour en savoir plus : https://twig.symfony.com/doc/filters/index.html
Structure de contrôle
Une structure de contrôle contrôlent le flux d'un programme.
Exemples de structure de contrôle :
- les conditions (c'est-à-dire
if
/elseif
/else
), - les boucles
for
, - ainsi que des éléments tels que les blocs.
Avec Twig, les structures de contrôle apparaissent à l'intérieur des blocs
{% ... %}
.
Par exemple, pour afficher une liste d'utilisateurs fournie dans une variable appelée utilisateurs,
utilisez la balise for
:
<h1>Members</h1>
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
La balise if
peut être utilisée pour tester une expression :
{% if users|length > 0 %}
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
{% endif %}
Consultez la documentation sur les balises Twig (des structures de contrôle) pour en savoir plus : https://twig.symfony.com/doc/tags/index.html
Exemple pratique
Prenons l'exemple d'un jeu de combat. Vous avez un tableau de personnages avec leurs noms et points de vie.
Vous voulez les afficher dans une page HTML avec Twig.
$characters = [
['name' => 'Mario', 'hp' => 100],
['name' => 'Luigi', 'hp' => 120],
['name' => 'Peach', 'hp' => 90],
];
echo $twig->render('characters.html', ['characters' => $characters]);
Et dans characters.html
:
<!DOCTYPE html>
<html>
<head>
<title>Characters</title>
</head>
<body>
<ul>
{% for character in characters %}
<li>{{ character.name }}: {{ character.hp }} HP</li>
{% endfor %}
</ul>
</body>
</html>
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Dans ce TP, vous allez créer une page de combat entre deux personnages.
Vous aurez besoin de deux templates Twig :
combat.html
pour afficher le combat,- et
result.html
pour afficher le résultat du combat.
Chaque personnage a un nom, des points de vie (hp) et des points d'attaque (attack). Un personnage attaque un autre en lui enlevant ses points d'attaque de ses points de vie.
Le combat se déroule en plusieurs tours jusqu'à ce qu'un personnage n'ait plus de points de vie.
À chaque tour, un personnage attaque l'autre.
Voici les étapes détaillées pour réaliser le TP :
- Initialisation des personnages :
Vous créez 2 personnages, Mario et Lara.
Pour simplifier le TP, nous n'allons pas créer de classes. Il s'agit uniquement de comprendre le fonctionnement de Twig.
Plus tard nous utiliserons Twig avec des classes PHP.
Chaque personnage a un nom, des points de vie (hp) et des points d'attaque (attack).
$mario = ['name' => 'Mario', 'hp' => 100, 'attack' => 20];
$lara = ['name' => 'Lara', 'hp' => 150, 'attack' => 15];
- Déroulement du combat :
-
Mario et Lara se battent en plusieurs tours.
-
À chaque tour, Mario attaque Lara, puis Lara attaque Mario.
-
Le combat continue jusqu'à ce qu'un des personnages n'ait plus de points de vie.
$combatLog = [];
while ($mario['hp'] > 0 && $lara['hp'] > 0) {
// Mario attaque Lara
$lara['hp'] -= $mario['attack'];
$combatLog[] = "Mario attaque Lara. Il reste {$lara['hp']} HP à Lara.";
// Si Lara est encore en vie, il attaque Mario
if ($lara['hp'] > 0) {
$mario['hp'] -= $lara['attack'];
$combatLog[] = "Lara attaque Mario. Il reste {$mario['hp']} HP à Mario.";
}
}
- Qui a gagné ? :
À la fin du combat, le personnage qui a encore des points de vie est le vainqueur.
$vainqueur = $mario['hp'] > 0 ? 'Mario' : 'Lara';
- Affichage du combat :
Vous utilisez Twig pour afficher le déroulement du combat dans une page Web. Pour cela, vous créez un template combat.html
.
echo $twig->render('combat.html', ['combatLog' => $combatLog]);
- Affichage du résultat :
De la même façon, vous utilisez Twig pour afficher le vainqueur du combat dans une autre page Web.
Vous créez un template result.html
.
echo $twig->render('result.html', ['vainqueur' => $vainqueur]);
- Création des templates Twig :
Dans vos templates Twig, vous utilisez la syntaxe de Twig pour afficher les variables et faire des boucles.
Par exemple, dans combat.html
, vous pouvez faire une boucle sur combatLog
pour afficher le déroulement du combat :
<ul>
{% for log in combatLog %}
<li>{{ log }}</li>
{% endfor %}
</ul>
Et dans result.html
, vous pouvez afficher le vainqueur du combat :
<h1>Le vainqueur est {{ vainqueur }} !</h1>
C'est tout ! Si vous suivez ces étapes, vous devriez pouvoir créer une simulation de combat entre 2 personnages en PHP avec Twig.
Une solution
Vous devez être connecté pour voir le contenu.