
In una vista Blade, dichiara una variabile con @php $nom = '…'; @endphp, oppure passala dal controller con view('vue', compact('nom')). Per stamparla, {{ $nom }} esegue l'escape dell'HTML e {!! $nom !!} lo inserisce così com'è. Usa la seconda forma solo su contenuti di cui ti fidi: è lì che nascono le falle XSS.
Due esigenze tornano di continuo in una vista Blade: dichiararvi una variabile e decidere se il suo contenuto vada escapato o reso così com’è. La seconda non è un dettaglio di comodità, è il punto esatto in cui si introduce una falla XSS.
Pubblicato nel percorso Sviluppo web. Questa guida copre entrambi gli aspetti: far arrivare una variabile nella vista, dichiararne una sul posto e scegliere tra {{ }} e {!! !!} con cognizione di causa. Esempi eseguiti su Laravel 13.30.1 con PHP 8.4.25.
Passare una variabile dal controller
È la via normale, quella da preferire: la vista mostra, il controller decide. Il secondo argomento di view() è un array associativo in cui ogni chiave diventa una variabile.
return view('dashboard', ['name' => 'Gekko']);<p>Bienvenue {{ $name }} !</p>Per stampare una data che arriva da un modello, vedi la gestione delle date con Carbon.
Se le variabili sono già in variabili PHP, compact() evita di ripeterne i nomi:
$name = 'Gekko';
$reseau = 'gekkode';
return view('dashboard', compact('name', 'reseau'));with() permette di aggiungerne una al volo, comodo quando il valore si calcola all’ultimo momento:
return view('dashboard', compact('name'))->with('extra', 'valeur ajoutée');Se una variabile può mancare, dalle un valore di ripiego nella vista invece di aggiungere una condizione:
{{ $inconnu ?? 'valeur par défaut' }}Dichiarare una variabile direttamente nella vista
Quando il valore serve solo alla visualizzazione, la direttiva @php permette di dichiararlo sul posto:
@php
$nom = 'Gekko';
$classe = $task->active ? 'is-active' : 'is-done';
@endphp
<p class="{{ $classe }}">Bonjour {{ $nom }}</p>Funzionano anche i tag PHP classici, ma @php resta più leggibile e più coerente con il resto del template.
Due direttive coprono i casi vicini senza passare da una variabile. @class costruisce un attributo di classe a partire da alcune condizioni:
<div @class(['actif' => $task->active, 'masque' => $task->hidden])></div>
<!-- rendu quand active vaut true et hidden false -->
<div class="actif"></div>E @once garantisce che un blocco venga reso una volta sola, anche se la vista è inclusa più volte nella pagina:
@once
<script src="/js/carte.js" defer></script>
@endonce@php va bene per un valore di visualizzazione. Non appena si tratta di una query sul database, di un calcolo di business o di un ciclo di trasformazione, il codice appartiene al controller, a un componente Blade o a un accessor del modello. Una vista che interroga il database genera query N+1 invisibili dal controller.
Stampare HTML: {{ }} contro {!! !!}
Blade compila {{ $variable }} in una chiamata alla funzione e(), che esegue l’escape dei caratteri speciali. Si vede nella vista compilata, sotto storage/framework/views:
<?php echo e($nom); ?>Conseguenza: se la variabile contiene dei tag, questi compaiono per esteso invece di essere interpretati.
@php $html = '<strong>gras</strong>'; @endphp
{{ $html }} {{-- affiche : <strong>gras</strong> --}}
{!! $html !!} {{-- affiche : gras, en gras --}}La sintassi {!! !!} inserisce il valore senza alcuna trasformazione. È quello che serve per stampare il corpo di un articolo scritto in HTML, ed è anche la porta d’ingresso di un’iniezione di script se il valore arriva da un utente.
Usa {!! !!} solo su HTML di cui controlli l’origine, oppure che è stato ripulito prima. Con il valore <script>alert(1)</script>, {{ }} stampa il testo mentre {!! !!} esegue lo script nel browser del visitatore. Entrambi i comportamenti sono stati verificati.
Per un contenuto che arriva da un form, che avrai avuto cura di proteggere dagli invii automatizzati, ripulisci prima di stampare. Una libreria come HTML Purifier applica una whitelist di tag, in alternativa, salva del Markdown e convertilo al momento del rendering, così resti tu a decidere quali tag vengono prodotti.
I casi particolari utili
Per passare dei dati a del JavaScript, @json produce un literal valido e già escapato:
<script>
const config = @json(['id' => $task->id, 'titre' => $task->title]);
</script>Per stampare delle graffe senza che Blade le interpreti, per esempio in un template destinato a un framework JavaScript, @verbatim neutralizza l’intero blocco:
@verbatim
<div id="app">{{ message }}</div>
@endverbatimPer una sola espressione basta farla precedere da una chiocciola: @{{ message }}.
{{ e($valeur) }} esegue l’escape due volte: <b> diventa &lt;b&gt; e viene stampato letteralmente a schermo. {{ }} lo fa già da sé. La funzione e() serve solo fuori da Blade, oppure dentro un {!! !!} su una porzione precisa.
Errori frequenti
<script>alert(1)</script> viene davvero eseguita nel browser del visitatore. Ripulisci prima l'HTML, oppure salva del Markdown.e(). Il risultato mostra le entità a schermo invece del testo.{{ $var ?? 'défaut' }} evita un errore se il controller non la passa in tutti i casi.

