Créer un nouveau message via un formulaire

Dans ce tutoriel nous allons créer un nouveau formulaire et une nouvelle route pour créer un message.

Création du formulaire

Le formulaire doit s'afficher sur la page du profil si la personne est connectée et si elle est sur sa page personnelle et non pas sur la page d'une autre personne. Pour cela, nous devons faire une condition dans ressources/views/utilisateur.blade.php :

@extends('layout')

@section('contenu')
    <div class="section">
        <h1 class="title is-1">{{ $utilisateur->email }}</h1>

        @if (auth()->check() AND auth()->user()->id === $utilisateur->id)
            {{-- Formulaire ici --}}
        @endif
    </div>
@endsection

Dans cette condition, auth()->user() représente la personne connectée et $utilisateur la personne de la page. Si les deux identifiants sont identiques, cela signifie que la personne est bien sur sa propre page.

Le formulaire peut ressembler à ça avec Bulma :

<form action="/messages" method="post">
    {{ csrf_field() }}

    <div class="field">
        <label class="label">Message</label>
        <div class="control">
            <textarea class="textarea" name="message" placeholder="Qu'avez-vous à dire ?"></textarea>
        </div>
        @if($errors->has('message'))
            <p class="help is-danger">{{ $errors->first('message') }}</p>
        @endif
    </div>

    <div class="field">
        <div class="control">
            <button class="button is-link" type="submit">Publier</button>
        </div>
    </div>
</form>

C'est une méthode de type POST, sur l'URL /messages. Il ne faut pas oublier le {{ csrf_field() }}. L'unique champ, de type textarea s'appelle message.

Création de la route

Nous allons donc créer une route de type POST sur l'URL messages dans le fichier routes/web.php :

Route::post('/messages', 'MessagesController@nouveau');

Création du contrôleur

Nous allons créer le contrôleur avec php artisan make:controller MessagesController puis y ajouter notre fonction nouveau().

<?php

namespace App\Http\Controllers;

use App\Message;

class MessagesController extends Controller
{
    public function nouveau()
    {
        // Vérification que la personne est bien connectée
        if (auth()->guest()) {
            flash("Vous devez être connecté pour voir cette page.")->error();

            return redirect('/connexion');
        }

        // Validation des données
        request()->validate([
            'message' => ['required'],
        ]);

        // Création d'un message dans la base de données avec Eloquent
        Message::create([
            'utilisateur_id' => auth()->id(),
            'contenu' => request('message'),
        ]);

        // Redirection vers la page de profil avec un message flash.
        flash("Votre message a bien été publié.")->success();
        return back();
    }
}

Il n'y a rien de nouveau dans ce contrôleur. Nous copions-collons à nouveau la vérification de la connexion et dans le prochain tutoriel, nous verrons comment simplifier cette partie.

Nous devons également, pour pouvoir utiliser la fonction ::create(), dire à Laravel les colonnes autorisées sur notre modèle app/Message.php. Nous devons donc ajouter l'attribut $fillable comme dans app/Utilisateur.php :

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Message extends Model
{
    protected $fillable = ['utilisateur_id', 'contenu'];
}

Nous pouvons maintenant ajouter nos messages et vérifier que tout fonctionne dans SQLite Browser.