Detectie en controle van variabelen in Twig-sjablonen
Wanneer je met een Twig-sjabloonbestand werkt, worden de meeste variabelen gedocumenteerd in de commentaren van het sjabloonbestand. Maar als dat niet zo is, of wanneer thema’s of modules nieuwe variabelen introduceren, hebben we een manier nodig om alle variabelen te ontdekken die binnen het sjabloon beschikbaar zijn. Twig biedt de functie dump() om variabelen te detecteren en te controleren in sjabloonbestanden.
De dump()-functie toont geen uitvoer als debugging niet is ingeschakeld. Lees hoe je Twig-debug inschakelt.
Nadat je debug hebt ingeschakeld, kan de dump()-functie gebruikt worden om informatie van één of meerdere variabelen in het sjabloon weer te geven.
Een enkele variabele controleren
Als er in je sjabloon een titelvariabele is, geeft het volgende de inhoud ervan weer in je sjabloon:
{{ dump(title) }}
Alle beschikbare variabelen in het sjabloon detecteren
Om alle beschikbare variabelen en hun inhoud in het sjabloon te tonen, voeg dit toe aan het sjabloon (nadat debug is ingeschakeld):
{{ dump() }}
Om alleen de beschikbare variabelesleutels weer te geven, gebruik:
{{ dump(_context|keys) }}
In alle Twig-sjablonen zijn extra globale variabelen beschikbaar:
- _self verwijst naar het huidige sjabloon en bevat uitgebreide informatie over het sjabloon, zoals de klassennaam van het gecompileerde sjabloon en informatie over de Twig-omgeving. _self is verouderd en verwijderd in Twig-versie 2.x.
- _context verwijst naar de huidige context en bevat alle variabelen die aan het sjabloon zijn doorgegeven, zoals variabelen van theme(), voorbereid door preprocess of ingesteld in het sjabloon. Het toevoegen van {{ dump() }} zonder variabele is gelijk aan {{ dump(_context) }}.
- _charset verwijst naar de huidige tekenset.
Pas op met dump()
Als je alle variabelen wilt zien, maar dump() leidt tot geheugenproblemen door recursie of iets dergelijks, kun je _context bekijken om alle sleutels erin te zien:
<ol>
{% for key, value in _context %}
<li>{{ key }}</li>
{% endfor %}
</ol>
Gebruik vervolgens een conditionele controle (bijvoorbeeld {% if loop.index == 2 %}) en toon die waarde alleen wanneer nodig.
Meer informatie
Zie de documentatie van de Twig dump()-functie voor meer informatie.
Debuggen met xdebug
De meest aanbevolen manier van debuggen is een IDE gebruiken met een xdebug-plugin.
De eenvoudigste configuratie is PHPStorm (commercieel) met xdebug. Microsoft VSCode is een gratis open-source IDE met plugins die hetzelfde doen zonder dat je commerciële software hoeft te kopen.
Met xdebug kun je stap voor stap door je code gaan, variabelen inspecteren en zo eindeloos debug-uitvoer of oneindige lussen vermijden die kunnen ontstaan bij gebruik van dump of kint.
Een kleine handige module genaamd twig_xdebug kan helpen om beschikbare variabelen zichtbaar te maken in xdebug.
Debuggen met kint
De dump()-functie in Twig genereert vaak heel veel tekst op de webpagina, waardoor het moeilijk wordt om de juiste informatie te vinden.
Een alternatief voor dump() is kint, een PHP-debugtool. De kint()-functie werkt net als dump(), maar geeft een overzichtelijke, inklapbare weergave van de variabelen die het toont.
Het devel-project biedt de devel kint-module, waarmee ontwikkelaars kint() kunnen gebruiken in plaats van dump().
1. Download de devel-module.
2. Installeer de “devel kint”-module.
3. Net als dump() geeft kint() geen uitvoer als debugging niet aanstaat. Lees hoe je Twig-debug inschakelt.
4. Gebruik in je .twig-bestanden kint() om variabelen te inspecteren, zoals beschreven bij dump().
5. Installeer eventueel de Search Kint-module om door geneste variabelen te zoeken.
Methode- en klasse-whitelist policy
Bij gebruik van objecten plaatsen we een whitelist van toegestane getter- en setter-methodes of objecten via de klasse TwigSandboxPolicy. Dit voorkomt dat willekeurige methodes in je sjablonen kunnen worden aangeroepen. Bijvoorbeeld: {{ node.delete }} op een node-object zou de node kunnen verwijderen als er geen whitelist bestond. Je kunt deze whitelist uitbreiden door in je settings.php het volgende toe te voegen:
$settings['twig_sandbox_whitelisted_methods'] = [ 'id', 'label', 'bundle', 'get', '__toString', 'toString', 'referencedEntities', ];
Waarbij 'referencedEntities' de methode is die je in je sjabloon wilt gebruiken.