Individuazione e verifica delle variabili nei template Twig
Quando si lavora con un file di template Twig, la maggior parte delle variabili è documentata nei commenti del file stesso. Tuttavia, quando non è così, o quando temi o moduli introducono nuove variabili, abbiamo bisogno di un modo per individuare tutte le variabili disponibili all’interno del template. Twig fornisce la funzione dump() per rilevare e controllare le variabili nei file di template.
La funzione dump() non mostrerà alcun output se il debug non è abilitato. Scopri come abilitare il debug di Twig.
Dopo aver abilitato il debug, la funzione dump() può essere utilizzata per stampare le informazioni su una o più variabili all’interno del template.
Controllare una singola variabile
Se nel tuo template esiste una variabile title, il seguente codice stamperà il suo contenuto nel template:
{{ dump(title) }}
Individuare tutte le variabili disponibili nel template
Per stampare tutte le variabili disponibili e i loro valori nel template, aggiungi quanto segue (dopo aver abilitato il debug):
{{ dump() }}
Per stampare solo le chiavi delle variabili disponibili, utilizza:
{{ dump(_context|keys) }}
In tutti i template Twig sono disponibili ulteriori variabili globali:
_selfsi riferisce al template corrente e contiene informazioni dettagliate sul template, come il nome della classe del template compilato e le informazioni sull’ambiente Twig. _self è deprecata ed è stata rimossa in Twig versione 2.x._contextsi riferisce al contesto corrente e contiene tutte le variabili passate al template, come variabili inviate datheme(), preparate nel preprocess o definite nel template. L’aggiunta di{{ dump() }}senza specificare una variabile è equivalente a{{ dump(_context) }}._charsetsi riferisce al set di caratteri attuale.
Attenzione con dump()
Se vuoi vedere tutte le variabili ma dump() provoca esaurimento di memoria a causa di ricorsione o simili, puoi iterare _context per vedere tutte le chiavi in esso contenute:
{% for key, value in _context %}
- {{ key }}
{% endfor %}
Poi puoi usare un controllo condizionale (ad esempio {% if loop.index == 2 %}) e stampare solo quel valore quando necessario.
Ulteriori informazioni
Consulta la documentazione della funzione dump di Twig per saperne di più.
Debug con xdebug
Il metodo di debug più raccomandato è utilizzare una IDE con plugin per Xdebug.
La configurazione più semplice è usare PHPStorm (commerciale) con Xdebug. Microsoft VSCode è un’IDE gratuita e open source con plugin che permettono di fare la stessa cosa, senza richiedere l’acquisto di software commerciale.
L’utilizzo di Xdebug ti consente di seguire il flusso di esecuzione, ispezionare il contenuto delle variabili e farlo in un modo che elimina le incognite interne, evitando cicli infiniti che possono verificarsi con dump o kint.
Un piccolo ma utile modulo chiamato twig_xdebug può aiutare a visualizzare le variabili disponibili in Xdebug.
Debug con kint
La funzione dump() in Twig spesso stampa molto testo sulla pagina web, rendendo difficile trovare le informazioni utili.
Un’alternativa a dump() è kint, uno strumento di debug per PHP. La funzione kint() funziona esattamente come dump() ma fornisce un’interfaccia espandibile e navigabile per le variabili stampate.
Il progetto Devel fornisce il modulo devel kint, che consente agli sviluppatori di utilizzare kint() al posto di dump().
1. Scarica il modulo Devel.
2. Installa il modulo “devel kint”.
3. Come per la funzione dump, kint() non mostrerà alcun output se il debug non è abilitato. Scopri come abilitare il debug di Twig.
4. Nei tuoi file .twig usa kint() per controllare le variabili, come descritto per dump().
5. Se necessario, scarica e installa il modulo Search Kint per cercare tra le variabili annidate.
Metodo e classe whitelist policy
Quando lavoriamo con oggetti, mettiamo in whitelist la chiamata di un insieme specifico di metodi getter e setter o oggetti tramite la classe TwigSandboxPolicy. Questo serve a prevenire l’esecuzione di metodi indesiderati nei template. Ad esempio: {{ node.delete }} su un oggetto nodo potrebbe eliminare il nodo se non ci fosse una whitelist. Puoi estendere questa whitelist aggiungendo nel tuo file settings.php quanto segue:
$settings['twig_sandbox_whitelisted_methods'] = [ 'id', 'label', 'bundle', 'get', '__toString', 'toString', 'referencedEntities', ];
Dove 'referencedEntities' è il metodo che vuoi utilizzare nel tuo template.