Contactez-nous

Redirection après succès et affichage de messages flash

Apprenez à rediriger les utilisateurs après une action réussie dans Laravel et à afficher des messages flash pour une meilleure expérience utilisateur.

Le principe de redirection après une action POST/PUT/DELETE

Après avoir traité avec succès une soumission de formulaire qui modifie l'état de l'application (comme la création, la mise à jour ou la suppression d'une ressource), il est de bonne pratique de rediriger l'utilisateur vers une autre page. C'est un patron de conception web courant connu sous le nom de Post/Redirect/Get (PRG). Ce patron aide à prévenir plusieurs problèmes, notamment :

  • Soumissions multiples du formulaire : Si l'utilisateur actualise la page après une soumission POST réussie qui n'a pas été suivie d'une redirection, le navigateur pourrait essayer de resoumettre les mêmes données, conduisant à des duplications ou des erreurs.
  • Problèmes avec le bouton "Précédent" du navigateur : La redirection vers une page GET rend l'historique de navigation plus propre et plus intuitif.

Dans Laravel, effectuer une redirection est simple. Typiquement, après avoir créé notre nouvelle note, nous voudrons rediriger l'utilisateur soit vers la page affichant la liste de toutes les notes (notes.index), soit vers la page de détail de la note qui vient d'être créée (notes.show).

Effectuer des redirections avec Laravel

Laravel fournit plusieurs façons d'émettre une réponse de redirection. La plus courante est d'utiliser la fonction helper redirect(), qui retourne une instance de Illuminate\Http\RedirectResponse. Sur cette instance, vous pouvez chaîner diverses méthodes pour spécifier la destination de la redirection.

  • Redirection vers une route nommée : C'est la méthode la plus robuste et recommandée car elle est découplée de l'URI réelle. Si l'URI de la route change, votre code de redirection n'a pas besoin d'être modifié. On utilise redirect()->route('nom.de.la.route', [$parametre1, $parametre2]).
  • Redirection vers une URL spécifique : redirect()->to('/une/url/specifique').
  • Redirection vers l'URL précédente : redirect()->back(). C'est utile, par exemple, après une erreur de validation où l'utilisateur est déjà sur la page du formulaire.
  • Redirection vers une action de contrôleur : redirect()->action('NomDuControleur@methode', [$parametre]) (syntaxe plus ancienne, route() est généralement préférée).

Dans notre méthode store du NoteController, après la création réussie de la note, nous allons rediriger l'utilisateur. Choisissons de rediriger vers la page de détail de la nouvelle note :

// Dans app/Http/Controllers/NoteController.php, méthode store()

public function store(Request $request)
{
    // ... (validation et création de $note comme vu précédemment)
    $validatedData = $request->validate([
        'title' => 'required|string|max:255|min:3',
        'content' => 'required|string|min:10',
    ]);

    $note = Note::create($validatedData);

    // Redirection vers la page de la note nouvellement créée
    return redirect()->route('notes.show', ['note' => $note->id]);

    // Si vous préférez rediriger vers la liste des notes :
    // return redirect()->route('notes.index');
}

Ici, route('notes.show', ['note' => $note->id]) génère l'URL pour la route nommée notes.show (qui est /notes/{note}) en passant l'ID de la note nouvellement créée comme paramètre de route. Si votre paramètre de route est simplement {id}, vous passeriez ['id' => $note->id] ou même juste $note->id si c'est le seul paramètre.

Utilisation des messages flash pour les notifications

Une simple redirection peut parfois laisser l'utilisateur incertain si son action a réussi. Il est donc courant d'accompagner la redirection d'un bref message de notification, appelé "message flash". Un message flash est une donnée stockée en session qui n'est disponible que pour la prochaine requête HTTP. Après avoir été affiché, il est automatiquement retiré de la session.

Laravel permet d'ajouter facilement des données flash à la session lors d'une redirection en utilisant la méthode with('cle', 'valeur') sur l'objet de redirection. La 'clé' sera utilisée pour récupérer le message dans la vue, et la 'valeur' est le message lui-même.

Modifions notre redirection pour inclure un message de succès :

// Dans app/Http/Controllers/NoteController.php, méthode store()

public function store(Request $request)
{
    // ... (validation et création de $note)
    $validatedData = $request->validate([
        'title' => 'required|string|max:255|min:3',
        'content' => 'required|string|min:10',
    ]);
    $note = Note::create($validatedData);

    // Redirection avec un message flash de succès
    return redirect()->route('notes.show', ['note' => $note->id])
                     ->with('success', 'Félicitations ! Votre note \"' . e($note->title) . '\" a été créée avec succès.');
    
    // Note: Utilisation de e() pour échapper le titre dans le message flash par sécurité,
    // bien que pour un affichage simple, ce ne soit pas toujours critique.
}

Nous avons utilisé la clé 'success' pour notre message. Vous pouvez utiliser n'importe quelle clé (par exemple, 'status', 'info', 'error') en fonction du type de notification que vous souhaitez afficher.

Affichage des messages flash dans les vues Blade

Pour que le message flash soit visible par l'utilisateur, nous devons ajouter une logique dans nos vues Blade pour vérifier sa présence en session et l'afficher si nécessaire. La fonction helper session('cle') permet de récupérer une donnée de la session.

Nous allons modifier notre layout de base resources/views/layouts/app.blade.php pour qu'il puisse afficher les messages flash de manière globale, ou bien vous pouvez l'ajouter spécifiquement dans les vues où vous attendez des messages (par exemple, notes.index ou notes.show). Idéalement, le layout est un bon endroit pour gérer les notifications générales.

Ajoutons un bloc pour les messages flash dans resources/views/layouts/app.blade.php, par exemple, juste avant le @yield('content') :



    

Mon Gestionnaire de Notes

{{-- Section pour les messages flash --}} @if (session('success')) @endif @if (session('error')) @endif
@yield('content')
{{-- ... reste du layout ... --}}

Maintenant, après avoir créé une nouvelle note, l'utilisateur sera redirigé vers la page de la note, et le message "Félicitations ! Votre note ... a été créée avec succès." s'affichera en haut de la page grâce à la classe alert alert-success de Bootstrap. Si vous actualisez cette page, le message disparaîtra, car il a été retiré de la session après son premier affichage.

Si vous aviez choisi de rediriger vers la page notes.index, et que votre logique d'affichage des messages flash était uniquement dans notes.index.blade.php (comme nous l'avions fait initialement), cela fonctionnerait également. Placer la logique dans le layout principal permet de gérer les messages flash de manière plus centralisée pour toute l'application.

La combinaison de redirections appropriées et de messages flash clairs contribue grandement à une expérience utilisateur fluide et informative. Laravel rend ces deux aspects très simples à mettre en oeuvre, complétant ainsi le cycle de traitement d'un formulaire de manière professionnelle.