Créer un formulaire

Dans ce tutoriel nous allons créer les bases d'un formulaire d'inscription avec Laravel.

Ajout d'une nouvelle route pour le formulaire HTML

Afin d'affiche le formulaire HTML, nous avons besoin de créer une nouvelle route avec une nouvelle vue.

Route::get('/inscription', function () {
    return view('inscription');
});
@extends('layout')

@section('contenu')
    <form action="/inscription" method="post">
        <input type="email" name="email" placeholder="Email">
        <input type="password" name="password" placeholder="Mot de passe">
        <input type="password" name="password_confirmation" placeholder="Mot de passe (confirmation)">
        <input type="submit" value="M'inscrire">
    </form>
@endsection

Le formulaire HTML est très classique. Je le redirige vers l'URL /inscription avec une méthode HTTP POST.

Lorsque nous essayons de valider ce formulaire, nous obtenons une erreur de type MethodNotAllowedHttpException. Pourquoi ?

Ajout d'une nouvelle route pour traiter le formulaire

L'URL /inscription existe déjà dans notre fichier routes/web.php mais la route existante ne répond qu'aux requêtes de type GET. Or, notre formulaire envoie une requête de type POST. Pour créer une route répondant au type POST, rien de plus simple :

Route::post('/inscription', function () {
    return 'Formulaire reçu';
});

Lorsque nous renvoyons à nouveau le formulaire, une nouvelle erreur s'affiche « This page has expired due to inactivity ».

Le problème du CSRF

Le CSRF est un type d'attaque très répandu sur le web. Laravel nous protège par défaut de ces attaques dans nos formulaires. Mais pour prévenir Laravel que notre formulaire est sécurisé, nous avons besoin d'ajouter une ligne dans notre HTML :

@extends('layout')

@section('contenu')
    <form action="/inscription" method="post">
        {{ csrf_field() }}

        <input type="email" name="email" placeholder="Email">
        <input type="password" name="password" placeholder="Mot de passe">
        <input type="password" name="password_confirmation" placeholder="Mot de passe (confirmation)">
        <input type="submit" value="M'inscrire">
    </form>
@endsection

Via la ligne csrf_field(), Laravel va ajouter un champ caché à notre formulaire (de type hidden) contenant une chaîne de caractères aléatoires. Et ce champ va lui permettre de protéger notre formulaire automatiquement contre les attaques de type CSRF. Nous verrons dans une future vidéo comment cette attaque peut être exploité et pourquoi nous devons ajouter cette ligne à nos formulaires.

En entrant à nouveau les données dans notre formulaire, cette fois ci tout fonctionne !

Récupération des données envoyées

Nous pouvons récupérer les données envoyés par le visiteur via la méthode PHP traditionnelle :

Route::post('/inscription', function () {
    return 'Votre email est ' . $_POST['email'];
});

Nous pouvons également utiliser la méthode Laravel que vous connaissez déjà et qui permet de récupérer non seulement les paramètres de type GET, les paramètres des URLs mais aussi les paramètres de type POST : la fonction request().

Route::post('/inscription', function () {
    return 'Votre email est ' . request('email');
});

Dans la suite de ce guide, nous allons devoir enregistrer l'inscription des utilisateurs en base de données. Pour cela, dans les prochains tutoriels, nous allons créer et configurer notre base de données.