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().
Chaque formulaire POST exige @csrf pour injecter un jeton de session inviolable et bloquer les requêtes forgées.
Déplacez vos règles hors du contrôleur grâce à php artisan make:request StoreProductRequest.
En cas d'échec de validation, Laravel redirige automatiquement, conserve la saisie avec old() et affiche $message.
Ne récupérez que les données saines et validées, éliminant tout risque d'injection accidentelle de champs malveillants.
// 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 !');
} 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.
| Règle de Validation | Comportement | Exemple 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' |