
Vues et Twig
Equivalent en Java Ă lâexpression language et JSTL mais en plus simple.
Twig est un moteur de templates minimaliste, lisible et performant qui permet de compiler en PHP un fichier Twig et de créer une page HTML.
Symfany ajoute des fonctionnalités à Twig.
Délimiteurs
Twig propose trois délimiteurs pour exécuter du code :
- {# ⊠#} pour les commentaires (que pour le dev, le client dans le navigateur ne les voit pas)
- {{ ⊠}} (double moustache) pour afficher une variable ou une fonction qui retourne une chaine de caractÚres (on ne met pas le dollar de la variable)
- {% ⊠%} pour exécuter du code PHP et pour les balises Twig
Balises Twig (tags)
Les balises Twig sont nombreuses, parmi les plus utilisées on trouve :
- apply
- autoescape
- block
- deprecated
- do
- embed
- extends
- flush
- for
- from
- if
- import
- include
- macro
- sandbox
- set
- use
- verbatim
- with
Il est possible de faire de lâhĂ©ritage entre Twigs avec extends, block et include.
La balise if finit par un endif et on utilise les mots-clé and, or, not au lieu des opérateurs habituels.
Il nây a pas de switch mais un Ă©quivalent existe.
La balise set permet de crĂ©er une variable directement dans la vue. Elle est peu utilisĂ©e sauf quand on veut la rĂ©cupĂ©rer dâailleurs (ex : afficher la date du jour).
La balise for finit par un endfor et permet de rĂ©cupĂ©rer des informations, comme le dernier Ă©lĂ©ment, le premier, lâactuel, lâindexâŠ
On peut faire un âfor ⊠elseâ si jamais la variable est vide.
{% set fleurs = ["rose", "tulipe", "marguerite"] %}
<h2>Exemple d'un if : </h2>
{% if fleurs[0] == "rose" %}
<p>La fleur est une rose.</p>
{% else %}
<p>Eh bien non, ce n'est pas une rose.</p>
{% endif %}
<h2>Exemple d'une boucle for : </h2>
<ul>
{% for fleur in fleurs %}
<li>{{ fleur }}</li>
{% else %}
<li>Pas de fleurs.</li>
{% endfor %}
</ul>
Filtres Twig
Un filtre sert Ă modifier lâaffichage dâune variable sans la modifier, avec un pipe |.
{% set fleurs = ["rose", "tulipe", "marguerite"] %}
<h2>Exemple d'un filtre : </h2>
<p>J'affiche {{ fleurs[1] }} en majuscules : {{ fleurs[1] | upper }}</p>
Les filtres sont nombreux, parmi les plus utilisĂ©es on trouve : âąabs
âąbatch
âącapitalize
âąconvert_encoding
âądate
âądate_modify
âądefault
âąescape
âąfirst
âąformat
âąjoin
âąjson_encode
âąkeys
âąlast
âąlength
âąlower
âąmarkdown_to_html
âąmerge
âąnl2br (pour convertir les sauts de ligne en balise <br>)
âąnumber_format
âąraw
âąreplace
âąreverse
âąround
âąslice
âąsort
âąsplit
âąstriptags
âątitle
âątrim
âąupperâąurl_encode
Blocs et héritage
Afin de limiter les rĂ©pĂ©titions, il est possible de crĂ©er des gabarits rĂ©utilisables avec des blocs et de lâhĂ©ritage entre Twigs.
Une page principale contient la trame gĂ©nĂ©rale : base.html.twig, ce fichier est dâailleurs créé automatiquement. Des blocs sont dĂ©finis pour les parties Ă modifier selon le Twig (ex : un block title, un block bodyâŠ) avec {% block title %}{% endblock %}.
Les autres Twigs hĂ©ritent de cette page avec {% extends âbase.html.twigâ %} et les blocs sont remplis Ă façon :
{% extends âbase.html.twigâ %}
{% block body %}
<p>Un contenu de body</p>
{% endblock %}
{% block title %}Un titre de Twig{% endblock %}
Un autre possibilitĂ© est dâutiliser lâinclusion avec include() comme en PHP mais on lâutilise rarement : {% include('fichier.html.twig') %}.
Gestion des assets
Avec lâhĂ©ritage, on ne peut pas appeler de fichiers (css, javascripts, imagesâŠ) puisque le chemin est diffĂ©rent selon le Twig dans lequel on se trouve.
On met tous ces fichiers dans le rĂ©pertoire public (chacun bien rangĂ© dans des rĂ©pertoires, bien sĂ»r) et on utilise des assets qui permettent dây accĂ©der dynamiquement.
Par exemple pour un fichier de style :
<link rel="stylesheet" href="{{ asset('css/style.css') }}">
De mĂȘme pour les liens Ă des URLs internes, on utilise soit {{ path('home') }} qui trouve par le nom de la route, soit {{ url('home') }} qui trouve par lâURL.
BP : Il est recommandĂ© dâutiliser path parce quâil y a trĂšs peu de raisons de changer le nom unique dâune route alors quâil est possible que son URL Ă©volue.
Il faut installer le paquet asset : composer require symfony/asset
Passer des variables Ă la vue
Dans le contrĂŽleur :
On utilise la mĂ©thode render() dans laquelle on passe un deuxiĂšme paramĂštre qui est un tableau avec la liste des variables quâon veut envoyer Ă la vue, sous la forme de clĂ©=>valeur.
Il est possible de déclarer le tableau avec les crochets ou bien avec la méthode compact() :
// avec les crochets
#[Route('/', name: 'home_index')]
public function index(): Response
{
$uneVar = "bonjour";
$uneAutre = 42;
return $this->render('home/index.html.twig', [
"uneVar" => $uneVar,
"uneAutre" => $uneAutre
]);
}
// avec compact()
#[Route('/', name: 'home_index')]
public function index(): Response
{
$uneVar = "bonjour";
$uneAutre = 42;
return $this->render('home/index.html.twig',
compact('uneVar', 'uneAutre')
);
}BP : Souvent, on met le mĂȘme nom pour la clĂ© et la variable si on utilise les crochets.
Dans le Twig :
On utilise les double moustaches dans lesquelles on appelle la clé.
<p>J'affiche les variables : {{ uneVar }} et {{ uneAutre }}.</p>
En vrac
- Symfony ne crĂ©e une instance du contrĂŽleur que si on y accĂšde (et câest un singleton).
- Git permet de crĂ©er des gist : ça crĂ©e un bout de code quâon peut partager avec lâURL et on peut discuter en dessous.
- Des blocks stylesheets et JavaScript sont gĂ©nĂ©rĂ©s par dĂ©faut : ils sont utilisĂ©s par le paquet encore (dont module Symfony UX) pour faire du JavaScript Ă lâintĂ©rieur de Symfony (Angular, Svelte, React, VueâŠ.).
- Ă la soutenance, penser Ă mettre un fil dâariane
- Pour avoir des feuilles de style appelées seulement dans certains Twigs, on peut faire un bloc css.
- Il est possible de récupérer le contenu du bloc parent et de le concaténer avec un nouveau avec la variable symfony
parent()
{% block title %} {{ parent() }} - Accueil {% endblock %}- Pour lâaccessibilitĂ©, on utilise des vraies balises (afin quâon puisse lire la class et son contenu).
- Pour afficher un footer avec lâannĂ©e en cours :
{{ "now" | date("Y") }}(mieux)ou bien créer une var date dans le controleur (
$date = new \DateTime();) et lâenvoyer via lerender().
- Pour ajouter une font en la téléchargeant :
- on ajoute les fichiers dans public, dans un répertoire /font
- dans le css : on crée la police et on lui donne un nom (autant de font-face que de fichiers)
- puis on peut lâutiliser
BP : mettre plusieurs polices si jamais il y a un problĂšme.
@font-face {
src: url("../fonts/Luciole-Regular.ttf");
font-family: "Luciole-Regular";
}
body {
font-family: Luciole-Regular, sans-serif;
}