24 avril 2023   |   De Jérôme Borg   |    Laravel

La validation

La validation

La validation

"Ne jamais faire confiance aux données reçues"

La validation des données est primordiale dans toutes applications informatiques.

Nous pouvons faire une validation coté client "front", mais ce n'est pas suffisant, il est essentiel de valider les données coté serveur "back".

Nous allons explorez plusieurs méthodes dans Laravel, pour enregistrer des données provenant d'un formulaire.

Il faut avant tout installer Laravel.

Nous allons partir d'un simple formulaire, avec 2 champs : email et message, les envois de formulaire seront enregistrés en base.

Commençons, pas créer le modèle, sa migration (-m), son controller (-c)

php artisan make:model Contact -m  -c

Dans la migration

Schema::create('contacts', function (Blueprint $table) {  
            $table->id();  
            $table->string('email');  
            $table->text('message');  
            $table->timestamps();  
});

Dans le modèle, nous ajoutons les champs que nous pouvons insérer 

protected $fillable = ['email', 'message'];

Enfin nous migrons, cela va créer la table contacts

php artisan migrate

Dans le routeur, nous allons ajouter 2 routes (routes/web.php), la première pour afficher la page de formulaire, et la seconde pour l'enregistrer

use App\Http\Controllers\ContactController;  
  
Route::get('contacts', [ContactController::class, 'create'])->name('contacts.create');  
Route::post('contacts', [ContactController::class, 'store'])->name('contacts.store');

A présent dans le controller, la méthode pour afficher la page de formulaire

public function create() {  
    return view('contacts.form');  
}

Enfin la page de formulaire (resources/contacts/form.blade.php)

<x-app-layout>  
    <x-slot name="header">  
        <h2 class="font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight">  
            {{ __('Contact') }}  
        </h2>  
    </x-slot>  
  
    <div class="py-12">  
        <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">  
            <div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg">  
                <div class="p-6 text-gray-900 dark:text-gray-100">  
                    <form action="{{ route('contacts.store') }}" method="POST">  
                        @csrf  
                          
                        <div>  
                            <label for="email">Email</label>  
                            <input type="email" name="email" id="email" class="border-gray-300 dark:border-gray-700 
dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500
 dark:focus:ring-indigo-600 rounded-md shadow-sm block mt-1 w-full" required autofocus value="{{ old(" email>  
                            <x-input-error :messages="$errors->get('email')" class="mt-2"></x-input-error>  
                        </div>  
                        <div>  
                            <label for="message">Message</label>  
                            <textarea name="message" id="message" class="border-gray-300 dark:border-gray-700 
dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 
dark:focus:ring-indigo-600 rounded-md shadow-sm block mt-1 w-full" required>{{ old('message') }}</textarea>  
                            <x-input-error :messages="$errors->get('message')" class="mt-2"></x-input-error>  
                        </div>  
  
                        <div class="flex items-center justify-end mt-4">  
                            <x-primary-button class="ml-4">  
                                Send  
                            </x-primary-button>  
                        </div>  
  
                    </form>  
                </div>  
            </div>  
        </div>  
    </div>  
</x-app-layout>

Nous venons de créer un simple formulaire, avec 2 champs, un de type email et les 2 a saisir obligatoirement "required". A l'envoi ils seront envoyés sur la route "contacts.store".

N'oublions pas la sécurité, avec la directive blade @csrf

A présent, en navigant a l'url http://127.0.0.1:8000/contacts, vous devriez avoir cette page

A présent nous allons pouvoir réceptionner nos données. 

Nous allons le faire de trois façons différentes, la méthode qu'il ne faut pas faire, la méthode validée, et la méthode validée et "clean architecture"

 

La méthode "tout le monde il est gentil"

Dans le controller, nous allons créer une méthode store, qui aura pour paramètres les données envoyées par post

public function store(Request $request) {  
    Contact::create($request->all());  
  
    return redirect()->route('contacts.create');  
}

Par le biais de méthode create, de la class Model, dont on hérite à la création du modèle Contact, nous procédons à l'enregistrement des données. Cela fonctionne

Cependant, l'email est-il bien remplie ? est-ce un email valable ? le message est-il bien remplie ?....

Bien que sur le front, nous avons ajouté des attributs "type='email'" et "required", il est très facile de les modifier ou de les supprimer grâce au devtools.

Il ne faut surtout pas procéder de cette façon.

 

La méthode validée "validator"

Laravel, met a disposition, une class validator, qui prend en paramètre les données reçues, un tableau associatif, avec pour clé : le nom du champ a valider, et pour valeur : les types de validation

Dans notre cas, l'email doit être présent, de type email, et faire maximum 255 caractères

Dans notre cas, le message doit être présent, et faire maximum 5000 caractères.

use Illuminate\Support\Facades\Validator;
/* ... */
public function store(Request $request) {  
    $validator = Validator::make($request->all(), [  
        'email' => 'required|string|email|max:255',  
        'message' => 'required|string|max:5000',  
    ]);  

Si les données, ne respecte pas la validation, la méthode fails renvoie à la vue de création avec les messages d'erreur

Cette méthode fonctionne et permet de valider les données, cependant si l'on souhaite respecter les principes SOLID, une classe ne doit avoir qu'une seule responsabilité, nous allons donc sortir la validation de la classe, grâce au formRequest

 

La méthode validée et "clean architecture"

Commençons pas créer notre formRequest

php artisan make:request ContactRequest

A présent, dans la formRequest, il faut commencer par autoriser l'utilisation dans la méthode autorize() -> return true; puis dans rules, nous allons insérer le tableau de paramètre du validator

public function authorize(): bool  
    {  
        return true;  
    }  
  
    public function rules(): array  
    {  
        return [  
            'email' => 'required|string|email|max:255',  
            'message' => 'required|string|max:5000',  
        ];  
    }

Enfin dans le controller, on passe en paramètre la variable $request, qui a présent est du type ContactRequest

public function store(ContactRequest $request) {  
    Contact::create($request->validated());  
  
    return redirect()->route('contacts.create');  
}

Les données sont validées, et la méthode store ne s'occupe que d'enregistrer les données.

De Jérôme Borg
Le 24 avril 2023
Temps de lecture : 15 min
Jérôme Borg
Jérôme Borg

Développeur fullstack laravel/VueJs, formateur

Tous les articles de cet auteur
Articles recommandés
Homestead
Homestead
Jérôme Borg De Jérôme Borg | 20 avril 2023 | Lu : 10min