Che cos’è Twig?
Twig è un template engine flessibile e potente per il linguaggio PHP. È stato progettato per essere sia veloce che sicuro, offrendo una sintassi chiara e concisa. Twig separa la logica di presentazione dalla logica applicativa permettendo agli sviluppatori php e ai web designer di lavorare in parallelo e in maniera indipendente.
Caratteristiche principali di Twig:
- Facile: Twig ha una sintassi specifica per i template che è sia leggibile che espressiva. Questo rende i template facili da scrivere e da comprendere anche per i web designer.
- Estensibile: Twig è altamente estensibile. Gli sviluppatori possono aggiungere funzionalità personalizzate attraverso estensioni, permettendo a Twig di adattarsi a una vasta gamma di esigenze e contesti.
- Sicuro: una delle principali preoccupazioni quando si lavora con i template è la sicurezza. Twig offre meccanismi come l’escaping automatico per prevenire attacchi di tipo script injection.
- Veloce: Twig compila i template in codice PHP plain, il che significa che, una volta compilati, i template sono estremamente veloci e efficienti.
- Separazione delle responsabilità: Twig promuove una chiara separazione tra la logica di presentazione e la logica applicativa. Questo non solo rende il codice più pulito e manutenibile, ma facilita anche la collaborazione tra sviluppatori e designer.
- Ben documentato: Ogni caratteristica di Twig è documentata e disponibile sul sito ufficiale
Twig rappresenta una soluzione potente per la gestione dei template in PHP. Con la sua sintassi chiara, le prestazioni ottimizzate e l’attenzione alla sicurezza, Twig offre agli sviluppatori uno strumento robusto e flessibile per la creazione di view dinamiche.
Come utilizzare Twig
I file dei template Twig sono localizzati di default all’interno della cartella templates/. Tale configurazione è definita all’interno del file di twig.yaml:
twig: default_path: '%kernel.project_dir%/templates'
Gli elementi di Twig sono separati dal resto del template tramite l’utilizzo dei delimitatori:
- {{ … }} utilizzato per stampare il contenuto di una variabile o il risulato di una espressione
- {% … %} utilizzato per racchiudere logica come strutture condizionali e cicli
- {# … #} utilizzato per l’inclusione di commenti all’interno del template. Tali commenti, non verranno renderizzati nell’output finale.
Symfony raccomanda le seguenti convenzioni per il naming di file e cartelle relative ai template:
- utilizzare lo stile snake case (underscore _ al posto degli spazi) per i nomi di file e cartelle. Esempio: blog/lista_articoli.html.twig
- definire due estensioni per i nomi dei file dove la prima è l’estensione che il template dovrà generare (es. HTML) e la seconda è twig. Esempio: index.html.twig
Variabili in Twig
Per accedere ad una variabile in Twig è sufficiente utilizzare la sintassi
{{ nome_variabile }}
Se una variabile è un oggetto si può accedere ai suoi attributi utilizzando la dot notation ‘.’. In caso di array, invece, si possono utilizzare le parentesi quadre ‘[]’
{{ prodotto.nome }} {{ prodotti[0].nome }}
In Twig è anche possibile definire una variabile lato template utilizzando la sintassi
{% set nome_variabile = "Valore" %}
Ad esempio, per definire una variabile tipo_utente con dentro il valore stringa admin è sufficiente l’istruzione seguente
{% set tipo_utente = "admin" %}
Strutture di controllo in Twig
Il costrutto if in Twig
Il costrutto if in Twig è simile a quello presente nel linguaggio PHP.
Per valutare una variabile contenente un valore booleano, consideriamo questo semplice esempio:
{% if autenticato == false %} <p>Accedi al sistema per proseguire.</p> {% endif %}
In Twig è possibile anche valutare se un array ha almeno un elemento:
{% if utenti %} . . . {% endif %}
Per valutare più rami condizionali e creare costrutti if più complessi è possibile usare elseif ed else, proprio come in PHP:
{% if carburante > 30 } Hai il pieno di carburante {% elseif carburante > 15} Hai più di metà pieno di carburante {% elseif carburante > 5} Rimangono solo {{ carburante }} litri di carburante {% else %} Sei in riserva! {% endif %}
Il costrutto for in Twig
Con for è possibile ciclare gli elementi di un array. Ad esempio, per stampare il nome di ogni prodotto contenuto nell’array prodotti è sufficiente scrivere le seguenti istruzioni:
{% for prodotto in prodotti %} {{ prodotto.nome }} {% endfor %}
All’interno di ogni blocco iterativo è possibile accedere ad una serie di variabili speciali:
- loop.index: l’indice dell’elemento corrente (partendo da 1)
- loop.index0: l’indice dell’elemento corrente (partendo da 0)
- loop.revindex : il numero di iterazioni rimanenti (partendo da 1)
- loop.revindex0: il numero di iterazioni rimanenti (partendo da 0)
- loop.first: true se è la prima iterazione
- loop.last: true se è l’ultima iterazione
- loop.length: il numero totale degli elementi nell’array
- loop.parent: presente solo all’interno di un ciclo annidato. Fornisce l’accesso all’oggetto loop del ciclo superiore.
Con Twig è possibile iterare, oltre che sui valori, anche sulle chiavi dell’array:
{% for key, prodotto in prodotti %} {{ key }}: {{ prodotto.nome }} {% endfor %}
Filtri in Twig
I filtri in Twig permettono di modificare e formattare i valori delle variabili prima di visualizzarle. La sintassi per l’utilizzo di un filtro è la seguente
{{ variabile|filtro }}
Affianco alla variabile si aggiunge il simbolo “|” chiamato pipe e, successivamente, si indica il filtro che si vuole utilizzare. I filtri possono anche essere concatenati per applicare più trasformazioni in sequenza.
Sul sito ufficiale è consultabile la lista completa dei filtri.
Di seguito analizzeremo alcuni dei filtri più comuni disponibili in Twig.
Il filtro upper in Twig
Il filtro upper in Twig converte una stringa in maiuscolo
{{ 'hello'|upper }}
Risultato: HELLO
Il filtro lower in Twig
Il filtro lower in Twig converte una stringa in minuscolo
{{ 'HELLO'|lower }}
Risultato: hello
Il filtro date in Twig
Il filtro date in Twig formatta una data in un formato specifico
{{ data_da_formattare|date('d/m/Y') }}
Risultato: 11/10/2023
Il filtro length in Twig
Il filtro length in Twig restituisce la lunghezza di una stringa o di un array
{{ 'hello'|length }}
Risultato: 5
Il filtro slice in Twig
Il filtro slice in Twig estrae una porzione di stringa o array
{{ 'hello world'|slice(0,5) }}
Risultato: hello
Funzioni in Twig
Oltre ai filtri, Twig offre una serie di funzioni che possono essere utilizzate per eseguire operazioni specifiche all’interno dei template. Le funzioni sono simili ai filtri, ma vengono invocate in modo diverso e spesso restituiscono valori piuttosto che trasformare dati esistenti. Per invocare una funzione è sufficiente utilizzare una sintassi simile a quella delle funzioni in molti linguaggi di programmazione:
{{ nome_funzione(argomento1, argomento2, ...) }}
Analogamente a quanto detto per i filtri, anche la lista completa delle funzioni in Twig è consultabile sul sito ufficiale.
Di seguito analizzeremo alcune funzioni presenti in Twig.
La funzione range in Twig
La funzione range in Twig restituisce una lista contenente una progressione aritmetica di numeri interi
{% for i in range(1, 5) %} {{ i }}, {% endfor %}
Risultato: 12345
La funzione dump in Twig
La funzione dump in Twig è molto utile in fase di debug, permette di stampare informazioni su una specifica variabile
{{ dump(prodotto) }}
Risultato
array:3 [ "nome" => "Pizza Margherita" ... ]
La funzione date in Twig
La funzione date in Twig permette di estrarre e manipolare la data corrente e di convertire una stringa in una data per effettuare comparazioni.
{% if date(prodotto.data_creazione) < date('-3days') %} . . . {% endif %}
Nell’esempio precedente, viene confrontata la data di creazione di un prodotto con la data di tre giorni fa.