Validation des données dans Laravel : pratique et puissante
Publié: 2023-05-03Aujourd'hui plus que jamais, il est crucial que les données de vos applications soient valides, précises et répondent à toutes les exigences du système. Il répond au besoin de maintenir la cohérence des données et d'éviter les failles de sécurité.
Laravel rend la validation des données simple et intuitive. Il suit une architecture de contrôleur de vue de modèle (MVC) et ne nécessite qu'une connaissance générale de PHP et des concepts de programmation orientée objet (POO). De plus, Laravel propose plusieurs méthodes pour valider les données entrantes.
Découvrez certaines de ces approches et découvrez comment appliquer des règles de validation à votre ensemble de données.
La validation des données simplifiée dans Laravel
Laravel fournit plusieurs règles de validation prêtes à l'emploi lorsque les utilisateurs de votre application soumettent des données via des formulaires. Vous pouvez marquer les champs de saisie comme requis, définir une longueur minimale ou maximale et exiger des entrées uniques (non dupliquées) et des adresses e-mail valides. Le validateur Laravel vérifie si l'entrée satisfait à ces règles ou à toute autre que vous spécifiez.
Ces règles de validation Laravel incluent :
-
required
— Les données du champ ne doivent pas être nulles ou vides. -
array
— Les données du champ doivent être un tableau PHP. -
bail
— La règle de validation cesse de s'exécuter après avoir rencontré son premier échec de validation. -
email
— Les données du champ doivent être une adresse e-mail valide. -
unique
— Les données de champ ne doivent pas avoir de doublons dans la table de base de données.
Toutes les méthodes de validation ont des avantages et des inconvénients, mais leur variété vous permet de choisir la meilleure approche pour vos besoins. Selon la méthode choisie, la validation Laravel peut se produire de plusieurs manières, avec des messages d'erreur manuels ou automatiques.
La méthode la plus courante est code>validate, utilisée pour les requêtes HTTP entrantes. Cette méthode est chaînée aux données de la requête, exécutant les règles de validation. Vous pouvez séparer les règles de chaque champ par des virgules, comme illustré dans l'exemple ci-dessous.
use Illuminate\Http\Request; public function store (Request $request){ $validated = $request->validate([ 'email' => ['required, unique:users, email, bail'], 'name' => ['required'], ]); }
Ici, email
est une entrée obligatoire, ce qui signifie qu'il ne peut pas être nul. De plus, elle doit être unique dans la table de base de données users
, garantissant que la même adresse e-mail n'est pas enregistrée deux fois. La dernière règle stipule que l'adresse e-mail doit également être valide. Dans le cas contraire, le processus de validation s'arrête. Le champ de nom est obligatoire mais n'a pas d'autres règles.
Si une règle de validation Laravel échoue, une réponse est générée automatiquement.
Bases de la validation
Pour mieux comprendre les méthodes de validation, considérons l'exemple suivant. Vous allez définir une route pour le point de terminaison et créer un contrôleur pour valider et traiter les données de la demande.
Tout d'abord, créez un point de terminaison simple qui permet aux utilisateurs de stocker leurs e-mails et mots de passe.
Définir l'itinéraire
Les routes Laravel sont définies dans le fichier routes/web.php pour une application web ou routes/api.php pour une API. Pour cet exemple, utilisez api.php :
use App\Http\Controllers\UserController; Route::post('/store', [UserController::class]);
Créer le contrôleur
Exécutez cette commande Artisan pour créer le contrôleur :
php artisan make:controller UserController
Cette commande crée un fichier UserController.php dans le répertoire app/Http/Controllers .
Maintenant, définissez une méthode store
pour valider les données entrant dans le point de terminaison du magasin avant de les stocker.
Cet exemple validera les champs suivants à l'aide de ces règles :
- email — Doit être unique, un email valide, et doit être obligatoire
- mot de passe — Doit avoir une longueur minimale, une confirmation de mot de passe et doit être obligatoire
- age — Doit être un nombre et doit être obligatoire
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller { /** * Store new user details. * */ public function store(Request $request){ $validated = $request->validate([ 'email' => 'required|unique:users|email', 'age' => 'required|numeric', 'password' => 'required|min:7|confirmed' ]); // After user data is validated, logic to store the data } }
La règle confirmed
vous permet d'exiger deux fois un champ particulier pour vérifier que les données sont exactes, comme les utilisateurs qui saisissent à nouveau leurs mots de passe lors de l'inscription. Cette règle nécessite un champ appelé password_confirmation
, dont les données doivent correspondre au champ du mot de passe .
Afficher les messages d'erreur
Si les critères de validation sont remplis, votre code continuera à s'exécuter normalement. Si la validation échoue, une exception IlluminateValidationValidationException
est levée et la réponse d'erreur appropriée est renvoyée.
L'exemple est basé sur une API, qui renvoie une réponse HTTP 422 Unprocessable Entity
au format JSON. Pour les applications Web, il serait redirigé vers l'URL précédente pour afficher le message d'erreur, et les données de la demande ont été envoyées à la session.
Vous pouvez utiliser la variable $errors
dans vos vues pour afficher les erreurs renvoyées :
@if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif
Vous pouvez également choisir de n'afficher que la première erreur ou d'effectuer une boucle pour toutes les afficher.
// Fetch all errors $errors->all() // Fetch only the first error $errors->first()
Remplir les formulaires
Le fait de repeupler les formulaires évite aux utilisateurs de retaper les informations afin qu'ils puissent se concentrer sur la correction de l'erreur. Dans l'exemple d'une adresse e-mail défaillante, vous pouvez repeupler le reste du formulaire en appelant l'ancienne valeur du champ name
.
$name = $request-> old('name') //Blade helper <input type="text" name="name" value="{{ old('name') }}">
Cette règle renverrait null
s'il n'y avait pas d'entrée précédente.
Validation avancée
Laravel fournit une autre méthode d'écriture de validations appelées demandes de formulaire. Une demande de formulaire est une classe de demande personnalisée qui organise les validations et désencombre votre contrôleur.
Ils ont leur propre logique de validation et d'autorisation adaptée aux grands volumes d'entrée et peuvent être utilisés pour définir des règles de validation et personnaliser les messages d'erreur.
Pour créer une demande de formulaire, exécutez cette commande Artisan :
php artisan make:request StoreUserRequest
Cette commande crée un fichier StoreUserRequest.php dans le répertoire app/Http/Requests et contient deux méthodes par défaut :
-
rules
renvoie des règles de validation pour les données de la demande. -
authorize
renvoie un booléen pour indiquer si cet utilisateur a l'autorisation d'effectuer l'action demandée.
Convertissez l'exemple précédent pour utiliser une demande de formulaire.
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class StoreUserRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { // Add logic to check if the user is authorized to submit this data. return true; } /** * Get the validation rules that apply to the request. * * @return array<string, mixed> */ public function rules() { return [ 'email' => 'required|unique:users|email', 'age' => 'required|numeric', 'password' => 'required|min:7|confirmed' ]; } }
Pour personnaliser les messages d'erreur de ces règles, vous pouvez remplacer la méthode messages dans la classe FormRequest
.
/** * Get the error messages for the defined validation rules. * * @return array */ public function messages() { return [ 'email.required' => 'An email address is required', 'email.email' => 'The email address must be valid', 'password.confirmed'=>'Re-type your password as password_confirmation, passwords does not match' ]; }
Remarque : Le nom des données et la règle de validation sont séparés par un point (.) avant les données du message.
Validation personnalisée
Pour créer une validation personnalisée, vous pouvez utiliser une façade Validator
au lieu de validate
. L'instance du validateur contient deux arguments : les données à valider et un tableau de règles de validation. Ces deux arguments sont passés à la méthode ::make
sur la façade du validateur, générant une nouvelle instance de validateur.
use Illuminate\Http\Request; public function store (Request $request){ $validator = Validator::make($request->all(),[ 'email' => 'required|unique:users|email', 'age' => 'required|numeric', 'password' => 'required|min:7|confirmed' ]); if ($validator->fails()) { // Return errors or redirect back with errors return $validator->errors(); } // Retrieve the validated input... $validated = $validator->validated(); // Continue logic to store the data }
Si vous souhaitez ajouter un direct automatique, vous pouvez exécuter la méthode validate
sur une instance de validateur préexistante. Si la validation échoue, une requête XHR produit une réponse JSON avec 422 Unprocessable Entity
comme code d'état, ou l'utilisateur sera immédiatement redirigé.
$validator = Validator::make($request->all(),[ 'email' => 'required|unique:users|email', 'password' => 'required|min:7|confirmed' ])->validate();
Vous pouvez également personnaliser vos messages d'erreur en passant un troisième argument appelé messages
à Validate::make method
:
$validator = Validator::make($request->all(),[ 'email' => 'required|unique:users|email', 'age' => 'required|numeric', 'password' => 'required|min:7|confirmed' ], $messages = [ 'required' => 'The :attribute field is required.', ]);
Remarque : L' :attribute
est remplacé par le nom du champ en cours de validation.
Résumé
La validation des données est cruciale pour garder votre jeu de données propre, correct et complet. La validation des données vous permet d'éliminer les erreurs dans vos données qui pourraient potentiellement corrompre ou avoir un impact sur votre projet. La validation devient de plus en plus importante lorsque vous travaillez à grande échelle et avec de grandes quantités de données.
Laravel permet de nombreuses approches flexibles pour garantir l'intégrité et l'exactitude des données qui transitent par votre application. Vous pouvez obtenir une logique de validation compliquée avec des méthodes par défaut et personnalisables, ce qui rend votre base de code bien structurée et plus facilement réutilisable.
Expédiez vos applications Laravel plus rapidement avec les services d'hébergement d'applications de Kinsta.