
Validation des données saisies
Apprenez à implémenter une validation robuste des données de formulaire dans Laravel pour garantir l'intégrité et la sécurité de votre application.
L'importance cruciale de la validation des données
Après avoir récupéré les données soumises par un formulaire, l'étape la plus critique avant de les utiliser ou de les stocker est la validation. Les données provenant de l'utilisateur ne doivent jamais être considérées comme sûres ou conformes par défaut. La validation sert plusieurs objectifs essentiels :
- Sécurité : Elle aide à prévenir les vulnérabilités courantes telles que les injections SQL, le Cross-Site Scripting (XSS), et d'autres attaques qui exploitent des données mal formées ou malveillantes.
- Intégrité des données : Elle garantit que les données stockées dans votre base de données sont cohérentes, précises et respectent le format attendu (par exemple, une adresse e-mail doit ressembler à une adresse e-mail, un âge doit être un nombre positif, etc.).
- Expérience utilisateur : Fournir des messages d'erreur clairs et spécifiques lorsque l'utilisateur saisit des données incorrectes améliore considérablement l'ergonomie de l'application.
Laravel est livré avec un composant de validation puissant et flexible qui simplifie grandement ce processus. Il offre une multitude de règles de validation prêtes à l'emploi et permet de définir facilement des règles personnalisées si nécessaire.
Validation simple directement dans le contrôleur
Pour des scénarios de validation simples, Laravel permet d'effectuer la validation directement dans votre méthode de contrôleur en utilisant la méthode validate disponible sur l'objet Illuminate\Http\Request (ou sur l'instance du contrôleur lui-même si vous utilisez $this->validate($request, ...)). Cette méthode prend deux arguments principaux :
- L'instance de la requête (
$request). - Un tableau associatif définissant les règles de validation pour chaque champ du formulaire.
Si l'une des règles de validation échoue, Laravel fait quelque chose de très intelligent : il génère automatiquement une réponse HTTP appropriée. S'il s'agit d'une requête web traditionnelle (non-AJAX), il redirige l'utilisateur vers l'URL précédente (généralement la page du formulaire) en y joignant les messages d'erreur et les données précédemment saisies (pour que l'utilisateur n'ait pas à tout retaper). S'il s'agit d'une requête AJAX, il retourne une réponse JSON avec un code de statut 422 (Unprocessable Entity) contenant les erreurs de validation.
Appliquons cela à la méthode store de notre NoteController pour valider les champs title et content :
// Dans app/Http/Controllers/NoteController.php
use Illuminate\Http\Request;
use App\Models\Note; // N'oubliez pas d'importer le modèle si ce n'est pas déjà fait
// ...
public function store(Request $request)
{
// Définition des règles de validation
$rules = [
'title' => 'required|string|max:255|min:3',
'content' => 'required|string|min:10',
];
// Définition des messages d'erreur personnalisés (optionnel)
$customMessages = [
'title.required' => 'Le titre de la note est obligatoire.',
'title.min' => 'Le titre doit contenir au moins :min caractères.',
'content.required' => 'Le contenu de la note ne peut pas être vide.',
'content.min' => 'Le contenu doit faire au moins :min caractères.'
];
// Exécution de la validation
$validatedData = $request->validate($rules, $customMessages);
// Si le code atteint ce point, la validation a réussi.
// $validatedData est un tableau contenant uniquement les champs qui ont été validés.
// dd($validatedData); // Pour vérifier les données validées
// Création de la note (nous y reviendrons)
// Note::create($validatedData);
// return redirect()->route('notes.index')->with('success', 'Note créée avec succès !');
return "Validation réussie pour le titre : " . $validatedData['title']; // Message temporaire
}
Dans cet exemple :
- Pour le champ
title, nous exigeons qu'il soitrequired(obligatoire), de typestring(chaîne de caractères), avec une longueur maximale (max) de 255 caractères et une longueur minimale (min) de 3 caractères. - Pour le champ
content, il doit êtrerequired, de typestring, et avoir une longueur minimale de 10 caractères. - Nous avons également fourni un tableau
$customMessagespour personnaliser les messages d'erreur. La clé du message est formée parnom_du_champ.nom_de_la_regle(par exemple,title.required). Le placeholder:mindans le messagetitle.minsera automatiquement remplacé par la valeur spécifiée dans la règle (ici, 3).
Si vous soumettez maintenant le formulaire en laissant un champ vide, ou avec un titre trop court, vous serez redirigé vers le formulaire de création, et les messages d'erreur (personnalisés ou par défaut si non spécifiés) devraient s'afficher grâce aux directives @error et $errors->all() que nous avons mises en place dans notre vue create.blade.php.
Quelques règles de validation courantes
Laravel offre une vaste panoplie de règles de validation. Voici quelques-unes des plus fréquemment utilisées :
accepted: Le champ doit être "yes", "on", 1, ou true (utile pour les cases à cocher "J'accepte les conditions").active_url: Le champ doit être une URL valide selondns_get_record.after:date/before:date: Le champ doit être une date postérieure/antérieure à une date donnée.alpha/alpha_dash/alpha_num: Le champ ne doit contenir que des caractères alphabétiques / alphanumériques, tirets et underscores / alphanumériques.array: Le champ doit être un tableau PHP.between:min,max: La taille du champ (chaîne, nombre, tableau, fichier) doit être entre min et max.boolean: Le champ doit pouvoir être interprété comme un booléen (true, false, 1, 0, "1", "0").confirmed: Le champ doit avoir un champ de confirmation correspondantnom_du_champ_confirmation(par exemple, pour la confirmation de mot de passe).date/date_format:format: Le champ doit être une date valide selonstrtotime/ un format spécifique.different:field: Le champ doit avoir une valeur différente de celle d'un autre champ.digits:value/digits_between:min,max: Le champ doit être numérique et avoir une longueur exacte / entre min et max.email: Le champ doit être une adresse e-mail valide.exists:table,column: La valeur du champ doit exister dans la colonne spécifiée d'une table de base de données.image/mimes:foo,bar,.../mimetypes:text/plain,...: Le fichier doit être une image / avoir un type MIME parmi ceux listés.in:foo,bar,.../not_in:foo,bar,...: La valeur du champ doit être / ne pas être dans la liste donnée.integer/numeric: Le champ doit être un entier / un nombre.ip/ipv4/ipv6: Le champ doit être une adresse IP / IPv4 / IPv6.json: Le champ doit être une chaîne JSON valide.nullable: Le champ peut êtrenull. S'il est présent, il doit passer les autres règles.present: Le champ doit être présent dans les données d'entrée, mais peut être vide.regex:pattern: Le champ doit correspondre à l'expression régulière donnée.required: Le champ doit être présent et non vide.same:field: Le champ doit avoir la même valeur qu'un autre champ.size:value: La taille du champ (chaîne, nombre, tableau, fichier) doit correspondre à la valeur donnée.string: Le champ doit être une chaîne de caractères.unique:table,column,except,idColumn: La valeur du champ doit être unique dans la table et la colonne données (utile pour les e-mails, noms d'utilisateur).url: Le champ doit être une URL valide.
Vous pouvez combiner plusieurs règles en les séparant par un pipe (|) ou en les fournissant sous forme de tableau : 'email' => ['required', 'email', 'unique:users,email_address'].
Affichage des erreurs de validation dans les vues Blade
Comme mentionné, si la validation échoue, Laravel redirige l'utilisateur vers la page précédente. Il met également à disposition une variable $errors (une instance de Illuminate\Support\MessageBag) dans toutes vos vues. Vous pouvez l'utiliser pour afficher les messages d'erreur.
Dans notre vue create.blade.php, nous avons déjà mis en place le nécessaire :
{{-- Pour afficher toutes les erreurs en haut du formulaire --}}
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
{{-- Pour afficher une erreur spécifique à côté d'un champ --}}
<div class="mb-3">
<label for="title" class="form-label">Titre</label>
<input type="text" class="form-control @error('title') is-invalid @enderror" id="title" name="title" value="{{ old('title') }}">
@error('title')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>$errors->any(): Vérifie s'il y a des erreurs.$errors->all(): Retourne un tableau de tous les messages d'erreur.- La directive
@error('nom_du_champ') ... @enderror: Exécute le bloc de code si une erreur existe pour le champ spécifié. A l'intérieur de ce bloc, la variable$messagecontient le message d'erreur pour ce champ. old('nom_du_champ'): Cette fonction helper est très utile pour repeupler le formulaire avec les données précédemment soumises par l'utilisateur, afin qu'il n'ait pas à tout retaper en cas d'erreur de validation.
La validation est un aspect fondamental du développement web sécurisé et convivial. Laravel fournit un ensemble d'outils complets pour la gérer efficacement. Pour des scénarios de validation plus complexes, vous pourriez envisager d'utiliser des Form Requests, qui permettent d'extraire la logique de validation des contrôleurs dans des classes dédiées, rendant vos contrôleurs plus concis.