Twig is de template-taal van Symfony. Je schrijft gewone HTML, maar met speciale tags voor variabelen, loops en if-statements. Zo maak je je pagina's dynamisch — de inhoud verandert op basis van data uit de controller.
1 De drie syntaxen van Twig
Twig heeft drie soorten speciale tags. Zodra je die herkent, begrijp je elk template:
{{ }}
Waarde afdrukken
Alles tussen {{ }} wordt op de pagina geprint.
{% %}
Logica uitvoeren
Voor if-statements, for-loops, extends, block, etc.
{# #}
Commentaar
Commentaar dat niet in de HTML terechtkomt.
2 Variabelen gebruiken
Vanuit de controller stuur je variabelen mee met render(). In Twig gebruik je ze met {{ }}.
Controller (PHP)
'naam' => 'Laptop Pro',
'prijs' => 999.99,
'op_voorraad' => true,
]);
Twig template
<p>€ {{ prijs }}</p>
{% if op_voorraad %}
<span>Op voorraad</span>
{% endif %}
🧪 Probeer het: pas de naam aan
Laptop Pro
€ 999.99
3 If-statements
Met {% if %} toon je content op basis van een voorwaarde. Let op: elk blok sluit je af met {% endif %}.
{# Eenvoudige if #}
{% if product.voorraad > 0 %}
<span class="badge-groen">Op voorraad</span>
{% else %}
<span class="badge-rood">Uitverkocht</span>
{% endif %}
{# If met meerdere opties #}
{% if product.prijs < 100 %}
<span>Goedkoop</span>
{% elseif product.prijs < 500 %}
<span>Middenprijsklasse</span>
{% else %}
<span>Premium</span>
{% endif %}
{# Is ingelogd? #}
{% if app.user %}
Welkom, {{ app.user.username }}!
{% endif %}
4 For-loops: lijsten tonen
Met {% for %} loop je door een lijst (array of collectie). Sluit altijd af met {% endfor %}.
<table>
<thead>
<tr><th>Naam</th><th>Prijs</th></tr>
</thead>
<tbody>
{% for product in producten %}
<tr>
<td>{{ product.naam }}</td>
<td>€ {{ product.prijs }}</td>
<td>
<a href="{{ path('product_detail', {id: product.id}) }}">
Bekijken
</a>
</td>
</tr>
{% else %}
{# Wordt getoond als de lijst leeg is #}
<tr><td colspan="3">Geen producten gevonden.</td></tr>
{% endfor %}
</tbody>
</table>
{% else %} blok binnen een for-loop werkt anders dan bij een if! Bij een for-loop betekent else: "als de lijst leeg is".
5 Template overerving: extends en block
Elke pagina heeft dezelfde header, navbar en footer. Met template overerving hoef je die maar één keer te schrijven. Je maakt een basistemplate en vult de lege blokken in per pagina.
<!DOCTYPE html>
<html>
<head>
<title>
{% block titel %}
Mijn Website
{% endblock %}
</title>
</head>
<body>
<nav>...navigatie...</nav>
{# Hier komt de pagina-inhoud #}
{% block inhoud %}{% endblock %}
<footer>...footer...</footer>
</body>
</html>
{# Overerven van het basistemplate #}
{% extends 'base.html.twig' %}
{# Eigen titel invullen #}
{% block titel %}
Producten | Mijn Website
{% endblock %}
{# Eigen inhoud invullen #}
{% block inhoud %}
<h1>Alle producten</h1>
{% for product in producten %}
<p>{{ product.naam }}</p>
{% endfor %}
{% endblock %}
extends gebruikt, mag je template alleen block-tags bevatten — geen losse HTML daarbuiten.
6 Live Twig editor: zie de uitvoer direct
Pas het Twig-template aan en klik op Render om de HTML-uitvoer te zien. De variabelen zijn al ingesteld.
HTML uitvoer (code)
Browser weergave
📋 Samenvatting
- ✓
{{ variabele }}— waarde op de pagina printen - ✓
{% if … %} … {% endif %}— conditioneel tonen - ✓
{% for item in lijst %} … {% endfor %}— loop door een lijst - ✓
extends 'base.html.twig'— overerven van een basistemplate - ✓
{% block naam %} … {% endblock %}— invulbare blokken
Kennischeck
Test of je de stof begrepen hebt
Klaar met deze les? Markeer hem als voltooid!