Laravel
Laravel 11 & 10 • Chapitre 3 : Développement

Formulaires, Sécurité CSRF & Validation (Form Requests)

Dans Laravel, le traitement des formulaires est à la fois sécurisé par défaut contre les attaques CSRF et d'une fluidité exemplaire grâce aux classes dédiées Form Request et aux directives Blade @error et old().

🛡️
Protection @csrf

Chaque formulaire POST exige @csrf pour injecter un jeton de session inviolable et bloquer les requêtes forgées.

📋
Form Request Dédiée

Déplacez vos règles hors du contrôleur grâce à php artisan make:request StoreProductRequest.

🔄
old() & @error

En cas d'échec de validation, Laravel redirige automatiquement, conserve la saisie avec old() et affiche $message.

✨
$request->validated()

Ne récupérez que les données saines et validées, éliminant tout risque d'injection accidentelle de champs malveillants.

StoreProductRequest.php & form.blade.php
// 1. app/Http/Requests/StoreProductRequest.php
namespace AppHttpRequests;

use IlluminateFoundationHttpFormRequest;

class StoreProductRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true; // Définir des permissions spécifiques si nécessaire
    }

    public function rules(): array
    {
        return [
            'name'        => ['required', 'string', 'min:3', 'max:150'],
            'email'       => ['required', 'email', 'unique:users,email'],
            'price'       => ['required', 'numeric', 'min:0.01'],
            'description' => ['nullable', 'string', 'min:10'],
        ];
    }
}

// 2. resources/views/products/create.blade.php (Formulaire Blade Moderne)
<form action="{{ route('products.store') }}" method="POST">
    @csrf <!-- Jeton obligatoire sous peine d'erreur 419 -->

    <div class="mb-3">
        <label class="form-label">Nom du produit</label>
        <input type="text" name="name" 
               value="{{ old('name') }}" 
               class="form-control @error('name') is-invalid @enderror">
        @error('name')
            <div class="invalid-feedback">{{ $message }}</div>
        @enderror
    </div>

    <button type="submit" class="btn btn-danger">Enregistrer</button>
</form>

// 3. Contrôleur épuré avec injection automatique de la requête validée :
public function store(StoreProductRequest $request)
{
    Product::create($request->validated());
    return redirect()->route('products.index')->with('success', 'Produit créé avec succès !');
}

Simulateur Studio de Validation Laravel & Réponse Blade

Simulation Interactive des Règles

Remplissez le formulaire ci-dessous avec des données valides ou invalides et observez le comportement réel du moteur de validation : application des règles, conservation des valeurs avec old() et affichage des messages @error.

Formulaire HTML / Blade :
RÉPONSE HTTP LARAVELEn attente
// En attente de soumission...
// Testez avec des champs vides pour voir les erreurs 422 Unprocessable Content.
Les Règles de Validation Indispensables
Règle de ValidationComportementExemple Pratique
'required'Le champ ne peut être ni vide ni nul.'title' => 'required'
'email'Vérifie le format conforme d'une adresse email.'email' => 'required|email'
'unique:table,colonne'Vérifie l'absence de doublon direct dans la table SQL spécifiée.'email' => 'unique:users,email'
'min:val' / 'max:val'Longueur minimale/maximale pour une chaîne, ou seuil pour un nombre.'password' => 'min:8'
'confirmed'Exige la présence d'un champ champ_confirmation identique (ex: mot de passe).'password' => 'confirmed'
'image' / 'mimes:jpg,png'Vérifie que le fichier envoyé est bien une image valide et vérifie ses extensions.'avatar' => 'image|max:2048'