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

La validation

La validation

<p><strong>La validation</strong></p> <p><strong>"Ne jamais faire confiance aux donn&eacute;es re&ccedil;ues"</strong></p> <p>La validation des donn&eacute;es est primordiale dans toutes applications informatiques.</p> <p>Nous pouvons faire une validation cot&eacute; client "front", mais ce n'est pas suffisant, il est essentiel de valider les donn&eacute;es cot&eacute; serveur "back".</p> <p>Nous allons explorez plusieurs m&eacute;thodes dans Laravel, pour enregistrer des donn&eacute;es provenant d'un formulaire.</p> <p>Il faut avant tout&nbsp;<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&eacute;s en base.</p> <p>Commen&ccedil;ons, pas cr&eacute;er le mod&egrave;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-&gt;id(); $table-&gt;string('email'); $table-&gt;text('message'); $table-&gt;timestamps(); });</code></pre> <p>Dans le mod&egrave;le, nous ajoutons les champs que nous pouvons ins&eacute;rer&nbsp;</p> <pre class="language-php"><code>protected $fillable = ['email', 'message'];</code></pre> <p>Enfin nous migrons, cela va cr&eacute;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&egrave;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'])-&gt;name('contacts.create'); Route::post('contacts', [ContactController::class, 'store'])-&gt;name('contacts.store');</code></pre> <p>A pr&eacute;sent dans le controller, la m&eacute;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>&lt;x-app-layout&gt; &lt;x-slot name="header"&gt; &lt;h2 class="font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight"&gt; {{ __('Contact') }} &lt;/h2&gt; &lt;/x-slot&gt; &lt;div class="py-12"&gt; &lt;div class="max-w-7xl mx-auto sm:px-6 lg:px-8"&gt; &lt;div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg"&gt; &lt;div class="p-6 text-gray-900 dark:text-gray-100"&gt; &lt;form action="{{ route('contacts.store') }}" method="POST"&gt; @csrf &lt;div&gt; &lt;label for="email"&gt;Email&lt;/label&gt; &lt;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&gt; &lt;x-input-error :messages="$errors-&gt;get('email')" class="mt-2"&gt;&lt;/x-input-error&gt; &lt;/div&gt; &lt;div&gt; &lt;label for="message"&gt;Message&lt;/label&gt; &lt;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&gt;{{ old('message') }}&lt;/textarea&gt; &lt;x-input-error :messages="$errors-&gt;get('message')" class="mt-2"&gt;&lt;/x-input-error&gt; &lt;/div&gt; &lt;div class="flex items-center justify-end mt-4"&gt; &lt;x-primary-button class="ml-4"&gt; Send &lt;/x-primary-button&gt; &lt;/div&gt; &lt;/form&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/x-app-layout&gt;</code></pre> <p>Nous venons de cr&eacute;er un simple formulaire, avec 2 champs, un de type email et les 2 a saisir obligatoirement "required". A l'envoi ils seront envoy&eacute;s sur la route "contacts.store".</p> <p>N'oublions pas la s&eacute;curit&eacute;, avec la directive blade @csrf</p> <p>A pr&eacute;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&eacute;sent nous allons pouvoir r&eacute;ceptionner nos donn&eacute;es.&nbsp;</p> <p>Nous allons le faire de trois fa&ccedil;ons diff&eacute;rentes, la m&eacute;thode qu'il ne faut pas faire, la m&eacute;thode valid&eacute;e, et la m&eacute;thode valid&eacute;e et "clean architecture"</p> <p>&nbsp;</p> <p><strong>La m&eacute;thode "tout le monde il est gentil"</strong></p> <p>Dans le controller, nous allons cr&eacute;er une m&eacute;thode store, qui aura pour param&egrave;tres les donn&eacute;es envoy&eacute;es par post</p> <pre class="language-php"><code>public function store(Request $request) { Contact::create($request-&gt;all()); return redirect()-&gt;route('contacts.create'); }</code></pre> <p>Par le biais de m&eacute;thode create, de la class Model, dont on h&eacute;rite &agrave; la cr&eacute;ation du mod&egrave;le Contact, nous proc&eacute;dons &agrave; l'enregistrement des donn&eacute;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&eacute; des attributs "type='email'" et "required", il est tr&egrave;s facile de les modifier ou de les supprimer gr&acirc;ce au devtools.</p> <p><strong><span style="color: #ff0000;">Il ne faut surtout pas proc&eacute;der de cette fa&ccedil;on.</span></strong></p> <p>&nbsp;</p> <p><strong>La m&eacute;thode valid&eacute;e "validator"</strong></p> <p>Laravel, met a disposition, une class validator, qui prend en param&egrave;tre les donn&eacute;es re&ccedil;ues, un tableau associatif, avec pour cl&eacute; : le nom du champ a valider, et pour valeur : les types de validation</p> <p>Dans notre cas, l'email doit &ecirc;tre pr&eacute;sent, de type email, et faire maximum 255 caract&egrave;res</p> <p>Dans notre cas, le message doit &ecirc;tre pr&eacute;sent, et faire maximum 5000 caract&egrave;res.</p> <pre class="language-php"><code>use Illuminate\Support\Facades\Validator; /* ... */ public function store(Request $request) { $validator = Validator::make($request-&gt;all(), [ 'email' =&gt; 'required|string|email|max:255', 'message' =&gt; 'required|string|max:5000', ]); </code></pre> <p>Si les donn&eacute;es, ne respecte pas la validation, la m&eacute;thode fails renvoie &agrave; la vue de cr&eacute;ation avec les messages d'erreur</p> <p><img src="../../../files/post-body-17379005080.png"></p> <p>Cette m&eacute;thode fonctionne et permet de valider les donn&eacute;es, cependant si l'on souhaite respecter les principes SOLID, une classe ne doit avoir qu'une seule responsabilit&eacute;, nous allons donc sortir la validation de la classe, gr&acirc;ce au formRequest</p> <p>&nbsp;</p> <p><strong>La m&eacute;thode valid&eacute;e et "clean architecture"</strong></p> <p>Commen&ccedil;ons pas cr&eacute;er notre formRequest</p> <pre class="language-bash"><code>php artisan make:request ContactRequest</code></pre> <p>A pr&eacute;sent, dans la formRequest, il faut commencer par autoriser l'utilisation dans la m&eacute;thode autorize() -&gt; return true; puis dans rules, nous allons ins&eacute;rer le tableau de param&egrave;tre du validator</p> <pre class="language-php"><code>public function authorize(): bool { return true; } public function rules(): array { return [ 'email' =&gt; 'required|string|email|max:255', 'message' =&gt; 'required|string|max:5000', ]; }</code></pre> <p>Enfin dans le controller, on passe en param&egrave;tre la variable $request, qui a pr&eacute;sent est du type ContactRequest</p> <pre class="language-php"><code>public function store(ContactRequest $request) { Contact::create($request-&gt;validated()); return redirect()-&gt;route('contacts.create'); }</code></pre> <p>Les donn&eacute;es sont valid&eacute;es, et la m&eacute;thode store ne s'occupe que d'enregistrer les donn&eacute;es.</p>
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