HTTP è un protocollo stateless. HTTP di per sé non ha meccanismi per mantenere le informazioni utente tra le richieste.
La sessione di Laravel offre un modo per mantenere i dati dell’utente attraverso più richieste.Nella sessione salvi informazioni che vuoi mantenere tra le richieste: stato di login, articoli nel carrello, dati parziali di un form.
Le impostazioni della sessione sono in config/session.php.
Puoi cambiare il driver tramite la variabile d’ambiente SESSION_DRIVER (file .env).
SESSION_DRIVER=database
I driver supportati di serie da Laravel sono:
Driver
Descrizione
file
Salva come file in storage/framework/sessions (predefinito)
cookie
Salva come cookie cifrato nel browser
database
Salva in una tabella del database
redis
Salva su Redis (veloce)
array
Salva in un array PHP (per test; non persiste tra le richieste)
Nel progetto Laravel di default è configurato il driver database. Con database serve la tabella sessions, già inclusa nelle migration predefinite: puoi usarla così com’è.
L’helper session() puoi chiamarlo da controller, viste o ovunque.
// Recupera un valore$value = session('key');// Recupera con valore predefinito$value = session('key', 'default');// Salva un valoresession(['key' => 'value']);
In entrambi i casi puoi verificare nei test con assertSessionHas. Nei controller usare $request->session() rende esplicite le dipendenze.
// Recupera specificando la chiave$value = $request->session()->get('key');// Con valore predefinito$value = $request->session()->get('key', 'default');// Con valore predefinito da closure$value = $request->session()->get('key', function () { return 'default';});// Recupera tutti i dati di sessione$data = $request->session()->all();
// true se il valore esiste ed è diverso da nullif ($request->session()->has('user_id')) { // ...}// true anche se null, purché la chiave esistaif ($request->session()->exists('user_id')) { // ...}// true se non esisteif ($request->session()->missing('user_id')) { // ...}
// Rimuove una chiave specifica$request->session()->forget('user_name');// Rimuove più chiavi insieme$request->session()->forget(['user_name', 'cart']);// Rimuove tutti i dati di sessione$request->session()->flush();
I dati flash sono dati di sessione validi solo per la richiesta successiva.
Sono adatti a informazioni da mostrare una sola volta, come un messaggio di successo o un errore di form.
// Estende tutti i dati flash di un'altra richiesta$request->session()->reflash();// Estende solo chiavi specifiche$request->session()->keep(['status', 'message']);
In caso di validazione fallita si combina back()->withErrors().
Laravel salva automaticamente gli errori come dati flash, così in Blade puoi usare la variabile $errors.
public function store(Request $request): RedirectResponse{ $validated = $request->validate([ 'title' => 'required|string|max:255', 'body' => 'required|string', ]); Post::create($validated); // Successo: redirect con messaggio flash return redirect() ->route('posts.index') ->with('success', 'Post creato.'); // In caso di validazione fallita Laravel esegue automaticamente back()->withErrors()->withInput()}
flush() elimina tutti i dati di sessione, incluso lo stato di login. Se vuoi eliminare solo i dati utente, usa forget() indicando le chiavi specifiche.