21 octobre 2021 108.922K

Formation Laravel : Validation

Une fois les données du formulaire récupérées vous avez la possibilité d’effectuer une validation afin de vérifier que ceux-ci correspondent bien à ce que vous attendez.

1. La méthode validate de l’objet $request

Pour ce faire une méthode très simple et rapide existe depuis l’objet $request : la méthode validate().
Pour illustrer ce chapitre nous allons reprendre les données du formulaire du chapitre précédent.

$validation = $request->validate([
    'title' => 'required|unique:books|max:255',
    'price' => 'required|number',
    'description' => 'required|max:255',
]);

Cette méthode ne fait pas partie des méthodes de la Class Request, elle est appelée via une macro de Laravel depuis la Class FoundationServiceProvider situé dans le namespace Illuminate\Foundation\Providers :

/**
 * Register the service provider.
 *
 * @return void
 */
public function register()
{
    parent::register();

    $this->registerRequestValidation();
    $this->registerRequestSignatureValidation();
}

/**
 * Register the "validate" macro on the request.
 *
 * @return void
 */
public function registerRequestValidation()
{
    Request::macro('validate', function (array $rules, ...$params) {
        return validator()->validate($this->all(), $rules, ...$params);
    });
}

Encore une partie qui semble magique n’est-ce pas ? ^^
Ce n’est pas bien grave si vous n’en comprenez, ici, pas complètement le fonctionnement. Je vous en parle simplement pour que vous sachiez d’où cette méthode nous vient.

2. Un formulaire de Request

Une manière plus « propre » consiste à créer un formulaire de requête afin de séparer ce qui touche au traitement de notre requête et éviter d’encombrer nos controllers avec des validations.

Nous allons donc commencer par créer un nouveau formulaire de requête via la commande suivante :

php artisan make:request BookRequest

Cela va créer un dossier Requests dans app/Http ainsi que votre premier FormRequest (formulaire de requête). En l’ouvrant on y voit ceci :

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class BookRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}

Nous avons donc notre BookRequest qui extends FormRequest et qui contient 2 méthodes : authorize() et rules(). Nous allons mettre les règles de notre validation dans rules et nous allons retourner la valeur de authorize() à true car nous voulons autoriser l’utilisateur à faire cette requête :

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class BookRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'title'         => 'required|unique:books|max:255',
            'price'         => 'required|numeric',
            'description'   => 'required|max:255',
            'cover'         => 'image|mimes:jpeg,jpg,png,gif,bmp,svg|max:1024'
        ];
    }
}

Pour avoir la liste exhaustive de l’ensemble des règles de validation je vous invite à vous rendre sur la documentation officielle 😉

Maintenant il faut passer ce formulaire de requête dans notre controller, pour cela nous avons juste à changer le typage de $request :

// on ajoute le namespace de BookRequest
use App\Http\Requests\BookRequest;

class BookController extends Controller {

    // on précise le type de $request, qui est un objet de la Class BookRequest maintenant
    public function store(BookRequest $request) {
        //
    }
}

3. Les messages d’erreurs

Maintenant que nous avons nos règles de validation côté serveur nous devons informer l’utilisateur de la réussite ou de l’échec de l’envoi de ses données côté front. Nous allons donc mettre en place des messages d’erreurs qui apparaitront en cas d’échec et permettront d’informer l’utilisateur.

Commençons par les erreurs. Comme nous venons de le voir dans le chapitre Formulaire Blade met à notre disposition la directive @error afin de nous permettre d’afficher une erreur si celle-ci existe. Par exemple si l’on veut afficher l’erreur pour la validation de l’input description :

@error('description')
    <p> {{  $message  }} </p>
@enderror

$message renverra le message en rapport avec cette erreur de validation. Les messages par défaut de vos validations sont dans le fichier ressources/lang/en/validation.php qui est un grand tableau de messages.

Attention car si vous changez les valeurs de la langue locale dans votre fichier app.php (par exemple par fr) Laravel ne saura plus où trouver les messages à renvoyer et renverra le « chemin » du message qu’il cherche. Par exemple ici : validation.max.string (car il s’agit de l’erreur ‘string’ dans l’array ‘max’ qui lui même est dans l’array du fichier validation).
Si vous voulez donc changer la langue de votre application n’oubliez pas d’ajouter le dossier de messages de la langue en question dans le dossier ‘lang’.

Avis

4.9
Évaluer 4.9 sur 5
Excellent86%
Splendide !14%
Sympa0%
Sans plus0%
Pas terrible0%

Pas de titre

Évaluer 5 sur 5
18 novembre 2022
Anonyme

Pas de titre

Évaluer 5 sur 5
3 août 2022
Anonyme

Pas de titre

Évaluer 5 sur 5
25 mai 2022

L’un des meilleurs cours de laravel !
Merci bien

Estimé Gliti

Très bien représenté

Évaluer 5 sur 5
13 avril 2022

Le cour est bien représenté et bien détaillé.
Merci.

Petit-Homme wadly

Pas de titre

Évaluer 5 sur 5
9 avril 2022

Merci

Anis kadri