Passer au contenu principal

Qu’est-ce qu’une session

HTTP est un protocole sans état : il ne dispose pas nativement d’un moyen de conserver des informations d’un utilisateur entre les requêtes. La session de Laravel fournit ce moyen sur plusieurs requêtes. État de connexion, contenu d’un panier, valeurs saisies dans un formulaire… placez en session tout ce que vous voulez conserver entre les requêtes.

Configuration du driver de session

La configuration se trouve dans config/session.php. Vous changez le driver via la variable SESSION_DRIVER (dans .env).
SESSION_DRIVER=database
Drivers pris en charge par défaut :
DriverDescription
fileStocke en fichiers sous storage/framework/sessions (par défaut)
cookieStocke dans un cookie chiffré côté navigateur
databaseStocke dans une table de la base
redisStocke dans Redis (rapide)
arrayStocke dans un tableau PHP (utilisé pour les tests, non persistant)
Le projet Laravel par défaut est configuré avec le driver database. Une table sessions est nécessaire, mais elle est fournie par la migration par défaut.

Accéder à la session

Deux façons d’accéder à la session : via une instance Request, ou via le helper global session().

Via l’instance Request

Recevez Request par type-hint dans la méthode de contrôleur, puis appelez $request->session().
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\View\View;

class DashboardController extends Controller
{
    public function index(Request $request): View
    {
        $username = $request->session()->get('username');

        return view('dashboard', ['username' => $username]);
    }
}

Via le helper session()

Le helper session() est utilisable depuis n’importe où (contrôleurs, vues…).
// Lire une valeur
$value = session('key');

// Avec une valeur par défaut
$value = session('key', 'valeur par défaut');

// Écrire une valeur
session(['key' => 'value']);
Les deux approches se testent avec assertSessionHas. Dans un contrôleur, $request->session() rend la dépendance explicite.

Opérations sur la session

Lecture

// Lire une clé
$value = $request->session()->get('key');

// Avec valeur par défaut
$value = $request->session()->get('key', 'default');

// Valeur par défaut via une closure
$value = $request->session()->get('key', function () {
    return 'default';
});

// Toutes les données de session
$data = $request->session()->all();

Vérification de présence

// true si présent et non null
if ($request->session()->has('user_id')) {
    // ...
}

// true si présent, même si null
if ($request->session()->exists('user_id')) {
    // ...
}

// true si absent
if ($request->session()->missing('user_id')) {
    // ...
}
Différence entre has et exists :
MéthodeCas null
hasretourne false
existsretourne true

Écriture

// Via l'instance Request
$request->session()->put('user_name', 'Tanaka');

// Via le helper
session(['user_name' => 'Tanaka']);

// Ajouter à un tableau
$request->session()->push('cart.items', ['id' => 1, 'name' => 'Article A']);

Suppression

// Supprimer une clé
$request->session()->forget('user_name');

// Plusieurs clés à la fois
$request->session()->forget(['user_name', 'cart']);

// Tout supprimer
$request->session()->flush();

Données flash

Les données flash sont des données de session valides uniquement pour la requête suivante. Utiles pour les messages de confirmation d’un formulaire ou les erreurs à afficher une seule fois.

Enregistrer avec flash()

$request->session()->flash('status', 'Publication enregistrée.');
Elles restent disponibles à la requête suivante, puis sont automatiquement supprimées.

Prolonger la durée des données flash

// Prolonge toutes les données flash d'une requête supplémentaire
$request->session()->reflash();

// Prolonge certaines clés uniquement
$request->session()->keep(['status', 'message']);

Afficher un message flash dans Blade

{{-- resources/views/layouts/app.blade.php --}}

@if (session('success'))
    <div class="alert alert-success">
        {{ session('success') }}
    </div>
@endif

@if (session('error'))
    <div class="alert alert-danger">
        {{ session('error') }}
    </div>
@endif
Placez l’affichage des messages flash dans un layout (layouts/app.blade.php) pour un affichage cohérent sur toutes les pages.

Exemple : message après envoi de formulaire

Après l’envoi d’un formulaire, enregistrer un message de succès en session et rediriger pour l’afficher à la page suivante est un pattern classique.
1

Définition des routes

use App\Http\Controllers\PostController;

Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
Route::get('/posts/create', [PostController::class, 'create'])->name('posts.create');
Route::post('/posts', [PostController::class, 'store'])->name('posts.store');
2

Implémentation du contrôleur

Dans store, après enregistrement, redirigez avec un message de succès.
<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;

class PostController extends Controller
{
    public function index(): View
    {
        $posts = Post::latest()->get();

        return view('posts.index', ['posts' => $posts]);
    }

    public function create(): View
    {
        return view('posts.create');
    }

    public function store(Request $request): RedirectResponse
    {
        $validated = $request->validate([
            'title' => 'required|string|max:255',
            'body'  => 'required|string',
        ]);

        Post::create($validated);

        return redirect()
            ->route('posts.index')
            ->with('success', 'Publication créée.');
    }
}
redirect()->with('success', '...') est un raccourci qui pousse une donnée flash vers la destination.
3

Afficher le message dans le layout

Ajoutez l’affichage des messages flash à resources/views/layouts/app.blade.php.
<!DOCTYPE html>
<html>
<head>
    <title>My App</title>
</head>
<body>
    {{-- Messages flash --}}
    @if (session('success'))
        <div class="alert alert-success">
            {{ session('success') }}
        </div>
    @endif

    @if (session('error'))
        <div class="alert alert-danger">
            {{ session('error') }}
        </div>
    @endif

    @yield('content')
</body>
</html>
4

Créer la vue de liste

{{-- resources/views/posts/index.blade.php --}}

@extends('layouts.app')

@section('content')
<h1>Liste des publications</h1>

@foreach ($posts as $post)
    <div>
        <h2>{{ $post->title }}</h2>
        <p>{{ $post->body }}</p>
    </div>
@endforeach
@endsection
Après enregistrement puis redirection, la page affiche une fois le message « Publication créée. ».

Combinaison avec les erreurs de validation

En cas d’échec de validation, combinez avec back()->withErrors(). Laravel place automatiquement les erreurs en flash data : la variable $errors est disponible dans Blade.
public function store(Request $request): RedirectResponse
{
    $validated = $request->validate([
        'title' => 'required|string|max:255',
        'body'  => 'required|string',
    ]);

    Post::create($validated);

    // Succès : redirection avec message flash
    return redirect()
        ->route('posts.index')
        ->with('success', 'Publication créée.');

    // En cas d'échec de validation, Laravel exécute automatiquement back()->withErrors()->withInput()
}
{{-- Page du formulaire --}}

@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

<form method="POST" action="{{ route('posts.store') }}">
    @csrf

    <div>
        <label for="title">Titre</label>
        <input
            id="title"
            type="text"
            name="title"
            value="{{ old('title') }}"
        />
        @error('title')
            <span>{{ $message }}</span>
        @enderror
    </div>

    <div>
        <label for="body">Contenu</label>
        <textarea id="body" name="body">{{ old('body') }}</textarea>
        @error('body')
            <span>{{ $message }}</span>
        @enderror
    </div>

    <button type="submit">Publier</button>
</form>
flush() supprime toutes les données de session, y compris l’état de connexion. Utilisez plutôt forget() pour cibler des clés précises.

Prochaines étapes

Validation

Découvrez comment valider les données saisies dans les formulaires.
Dernière modification le 13 juillet 2026