La validation
<p><strong>La validation</strong></p>
<p><strong>"Ne jamais faire confiance aux données reçues"</strong></p>
<p>La validation des données est primordiale dans toutes applications informatiques.</p>
<p>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".</p>
<p>Nous allons explorez plusieurs méthodes dans Laravel, pour enregistrer des données provenant d'un formulaire.</p>
<p>Il faut avant tout <a href="https://www.the-blob.io/posts/installer-laravel-10" target="_blank" rel="noopener">installer Laravel</a>.</p>
<p>Nous allons partir d'un simple formulaire, avec 2 champs : email et message, les envois de formulaire seront enregistrés en base.</p>
<p>Commençons, pas créer le modèle, sa migration (-m), son controller (-c)</p>
<pre class="language-bash"><code>php artisan make:model Contact -m -c</code></pre>
<p>Dans la migration</p>
<pre class="language-php"><code>Schema::create('contacts', function (Blueprint $table) {
$table->id();
$table->string('email');
$table->text('message');
$table->timestamps();
});</code></pre>
<p>Dans le modèle, nous ajoutons les champs que nous pouvons insérer </p>
<pre class="language-php"><code>protected $fillable = ['email', 'message'];</code></pre>
<p>Enfin nous migrons, cela va créer la table contacts</p>
<pre class="language-bash"><code>php artisan migrate</code></pre>
<p>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</p>
<pre class="language-php"><code>use App\Http\Controllers\ContactController;
Route::get('contacts', [ContactController::class, 'create'])->name('contacts.create');
Route::post('contacts', [ContactController::class, 'store'])->name('contacts.store');</code></pre>
<p>A présent dans le controller, la méthode pour afficher la page de formulaire</p>
<pre class="language-php"><code>public function create() {
return view('contacts.form');
}</code></pre>
<p>Enfin la page de formulaire (resources/contacts/form.blade.php)</p>
<pre class="language-html"><code><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></code></pre>
<p>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".</p>
<p>N'oublions pas la sécurité, avec la directive blade @csrf</p>
<p>A présent, en navigant a l'url http://127.0.0.1:8000/contacts, vous devriez avoir cette page</p>
<p><img src="../../../files/post-body-17379000220.png"></p>
<p>A présent nous allons pouvoir réceptionner nos données. </p>
<p>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"</p>
<p> </p>
<p><strong>La méthode "tout le monde il est gentil"</strong></p>
<p>Dans le controller, nous allons créer une méthode store, qui aura pour paramètres les données envoyées par post</p>
<pre class="language-php"><code>public function store(Request $request) {
Contact::create($request->all());
return redirect()->route('contacts.create');
}</code></pre>
<p>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</p>
<p><img src="../../../files/post-body-17379017250.png"></p>
<p>Cependant, l'email est-il bien remplie ? est-ce un email valable ? le message est-il bien remplie ?....</p>
<p>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.</p>
<p><strong><span style="color: #ff0000;">Il ne faut surtout pas procéder de cette façon.</span></strong></p>
<p> </p>
<p><strong>La méthode validée "validator"</strong></p>
<p>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</p>
<p>Dans notre cas, l'email doit être présent, de type email, et faire maximum 255 caractères</p>
<p>Dans notre cas, le message doit être présent, et faire maximum 5000 caractères.</p>
<pre class="language-php"><code>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',
]); </code></pre>
<p>Si les données, ne respecte pas la validation, la méthode fails renvoie à la vue de création avec les messages d'erreur</p>
<p><img src="../../../files/post-body-17379005080.png"></p>
<p>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</p>
<p> </p>
<p><strong>La méthode validée et "clean architecture"</strong></p>
<p>Commençons pas créer notre formRequest</p>
<pre class="language-bash"><code>php artisan make:request ContactRequest</code></pre>
<p>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</p>
<pre class="language-php"><code>public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'email' => 'required|string|email|max:255',
'message' => 'required|string|max:5000',
];
}</code></pre>
<p>Enfin dans le controller, on passe en paramètre la variable $request, qui a présent est du type ContactRequest</p>
<pre class="language-php"><code>public function store(ContactRequest $request) {
Contact::create($request->validated());
return redirect()->route('contacts.create');
}</code></pre>
<p>Les données sont validées, et la méthode store ne s'occupe que d'enregistrer les données.</p>
De Jérôme Borg
Le 24 avril 2023
Temps de lecture : 15 min
Le 24 avril 2023
Temps de lecture : 15 min