Passer au contenu principal

Qu’est-ce que la validation

La validation consiste à vérifier que les données envoyées par un utilisateur satisfont un format et des conditions attendues. Laravel propose une validation simple et puissante via la méthode validate de l’objet de requête ou des form requests dédiés.

Validation dans le contrôleur

$request->validate()

L’appel à $request->validate() dans une méthode de contrôleur est la méthode la plus simple. En cas d’échec, Laravel redirige automatiquement vers l’écran précédent et stocke les erreurs en session. Déclaration des routes :
use App\Http\Controllers\PostController;

Route::get('/post/create', [PostController::class, 'create']);
Route::post('/post', [PostController::class, 'store']);
Création du contrôleur :
<?php

namespace App\Http\Controllers;

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

class PostController extends Controller
{
    public function create(): View
    {
        return view('post.create');
    }

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

        // Enregistrement de la publication avec les données validées...

        return redirect('/posts');
    }
}
Passez à validate un tableau : nom du champ en clé, règles en valeur. Séparez les règles avec | ou passez un tableau.
// Séparé par |
'title' => 'required|string|max:255',

// Tableau
'title' => ['required', 'string', 'max:255'],

Règles principales

RègleDescription
requiredLa valeur doit être présente et non vide
stringDoit être une chaîne
emailDoit être une adresse e-mail valide
min:valeurLongueur de chaîne ou valeur numérique supérieure ou égale
max:valeurLongueur de chaîne ou valeur numérique inférieure ou égale
unique:tableValeur unique dans la table donnée
nullableAutorise null
integerDoit être un entier
booleanDoit être un booléen (true/false, 1/0…)
dateDoit être une date valide
confirmedDoit correspondre à un champ nom_champ_confirmation
Toutes les règles disponibles se trouvent dans la documentation officielle.

Utiliser les données validées

validate retourne un tableau contenant uniquement les données validées. Vous pouvez les utiliser en toute confiance.
$validated = $request->validate([
    'title' => 'required|string|max:255',
    'body'  => 'required|string',
]);

// $validated a la forme ['title' => '...', 'body' => '...']
Post::create($validated);

Affichage des erreurs dans Blade

En cas d’échec, Laravel rend la variable $errors disponible dans toutes les vues, grâce au middleware ShareErrorsFromSession inclus dans le groupe web.

Afficher toutes les erreurs

@if ($errors->any())
    <ul>
        @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
        @endforeach
    </ul>
@endif

Afficher les erreurs par champ

@error affiche l’erreur d’un champ précis en inline.
<label for="title">Titre</label>

<input
    id="title"
    type="text"
    name="title"
    value="{{ old('title') }}"
    class="@error('title') is-invalid @enderror"
/>

@error('title')
    <div class="error-message">{{ $message }}</div>
@enderror
old('nom_champ') réaffiche la valeur saisie par l’utilisateur même après un échec de validation.

Form requests

Qu’est-ce qu’une form request

Quand la logique de validation devient complexe, il est efficace de l’externaliser dans une classe « form request ». Elle regroupe la validation et l’autorisation dans une classe de requête personnalisée.

Créer une form request

Utilisez make:request pour générer la classe.
php artisan make:request StorePostRequest
app/Http/Requests/StorePostRequest.php est généré.
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StorePostRequest extends FormRequest
{
    /**
     * Détermine si l'utilisateur est autorisé à effectuer cette requête.
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Règles de validation appliquées.
     *
     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
     */
    public function rules(): array
    {
        return [
            'title' => 'required|string|max:255',
            'body'  => 'required|string',
            'email' => 'required|email|unique:posts',
        ];
    }
}

Méthode rules()

Retourne les règles de validation sous forme de tableau, comme celui passé à validate.

Méthode authorize()

Détermine si l’utilisateur peut effectuer cette requête. true autorise, false retourne automatiquement une réponse 403. Pour n’autoriser que les utilisateurs authentifiés, vérifiez avec auth()->check(). Dans un tutoriel, il est acceptable de retourner true.
Si authorize retourne false, la méthode du contrôleur n’est pas exécutée : une réponse 403 est renvoyée.

Injection dans le contrôleur

Il suffit de type-hinter la form request dans la méthode. La validation s’exécute avant la méthode : vous n’écrivez plus de code de validation dans le contrôleur.
use App\Http\Requests\StorePostRequest;

class PostController extends Controller
{
    public function store(StorePostRequest $request): RedirectResponse
    {
        // À ce stade, la requête est validée

        $validated = $request->validated();

        Post::create($validated);

        return redirect('/posts');
    }
}
$request->validated() retourne uniquement les données validées.

Exemple : formulaire de création et enregistrement

Enchaînement complet de l’affichage du formulaire à l’enregistrement.
1

Déclaration des routes

use App\Http\Controllers\PostController;

Route::get('/posts/create', [PostController::class, 'create']);
Route::post('/posts', [PostController::class, 'store']);
2

Création de la form request

php artisan make:request StorePostRequest
public function rules(): array
{
    return [
        'title' => 'required|string|max:255',
        'body'  => 'required|string',
    ];
}

public function authorize(): bool
{
    return true;
}
3

Implémentation du contrôleur

use App\Http\Requests\StorePostRequest;
use App\Models\Post;

class PostController extends Controller
{
    public function create(): View
    {
        return view('posts.create');
    }

    public function store(StorePostRequest $request): RedirectResponse
    {
        Post::create($request->validated());

        return redirect('/posts');
    }
}
4

Création du template Blade

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

<h1>Nouvelle publication</h1>

@if ($errors->any())
    <ul>
        @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
        @endforeach
    </ul>
@endif

<form method="POST" action="/posts">
    @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>
Incluez toujours la directive @csrf dans les formulaires Blade. Sans le token CSRF, Laravel renvoie une erreur 419.

Prochaines étapes

Requêtes HTTP

Revenez sur les moyens de récupérer les données via l’objet Request.
Dernière modification le 13 juillet 2026