Travail en autonomie n°5-6 - Messages flash dans la session pour gérer les redirections
Travail sur les messages flash qui permettent de mieux gérer les redirections dans le code de gestion des formulaires
Table des matières
Introduction
L’objectif de cette étape est d’expérimenter l’utilisation des messages flash de Symfony, pour comprendre le fonctionnement de la session.
Dans la séquence de travail précédente, vous avez étudié le fonctionnement du mécanisme de gestion de la soumission de données dans les formulaires.
À la fin des traitements qui se déroulent avec succès, la gestion faite dans les contrôleurs envoie un code de réponse HTTP qui entraîne une redirection effectuée par le navigateur, pour recharger une autre page.
Or cette redirection, qui entraîne une nouvelle requête, donc l’exécution d’une nouvelle instance de l’application, fait perdre le contexte de l’exécution précédente.
Grâce aux sessions, on peut cependant mettre en oeuvre une continuité entre le traîtement de la requête de soumission de données, avant la redirection, et la gestion de la requête après redirection, par exemple si l’on doit afficher un message à l’utilisateur.
Principe des « messages flash » Symfony
Dans la mise en œuvre des gestionnaires de soumissions des formulaires, on effectue des redirections, une fois les requêtes de soumission traitées. Or le rechargement qui est effectué dans le navigateur de la nouvelle page vers laquelle on est redirigé, masque les messages éventuellement affichés sur la page de résultat du traitement de la requête précédente.
On va utiliser les Flash Messages de la session Symfony, pour mettre en attente des messages qui seront affichés dès que possible, c’est à dire au prochain affichage d’un gabarit de page de l’application.
En pratique, le code suivant permet de stocker un message flash dans le « sac » (Bag ou multi-ensemble) des messages flash de la session :
$this->get('session')->getFlashBag()->add('message', 'blah blah');
Pour le retrouver, dans les templates Twig, il suffit d’accéder à
l’instance de la session courante, avec app.session
, avec quelque
chose comme :
{% for message in app.session.getFlashBag.get('message') %} {{ message }} {% endfor %}
Comme ils sont stockés dans la session, ces messages peuvent survivre à la redirection qui est provoquée en fin de traitement des requêtes POST.
Si les messages sont sauvés dans la session avant la redirection, on les y retrouve à l’exécution suivante.
Étude du fonctionnement des messages flash
Vous allez ajouter une gestion de messages de confirmation, sur le résultat du traitement des données soumises via les formulaires CRUD : sauvegarde effectuée, confirmation d’ajout, etc.
Ces messages seront mis en oeuvre via des « messages flash » Symfony.
Ajout du code PHP et Twig
Procédez aux étapes suivantes :
Ajoutez au code d’un des gestionnaires de soumissions de formulaire, un « message flash », juste avant la redirection :
Par exemple :
public function new(Request $request): Response { ... if ($form->isSubmitted() && $form->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($paste); $em->flush(); // Make sure message will be displayed after redirect $this->get('session')->getFlashBag()->add('message', 'bien ajouté'); return $this->redirectToRoute('index'); } ...
Ajoutez le code d’affichage des messages flashs dans le template Twig de base, juste au début du bloc
body
:{% block body %} {% block alerts %} {% for type, messages in app.session.flashBag.all %} {% for message in messages %} {%if type == 'error'%} {% set type = 'danger' %} {%endif%} {%if type == 'message'%} {% set type = 'info' %} {%endif%} <div class="alert alert-{{ type }} alert-dismissible" role="alert"> <button type="button" class="close" data-dismiss="alert"> <span aria-hidden="true">×</span> <span class="sr-only">Close</span> </button> <p>{{ message|raw }}</p> </div> {% endfor %} {% endfor %} {% endblock %} {# alerts #} ...
Ce block
alerts
accède à tous les messages en attente dans le flashbag, et affiche des boutons Bootstrap correspondant au type de message (erreur, message).
Test de fonctionnement des messages
Maintenant, testez l’application ainsi modifiée en créant une nouvelle
Paste
dans la base de données :
Ouvrez une « fenêtre de navigation privée » dans le navigateur, et connectez-vous à l’application. Ouvrez l’inspecteur réseau pour observer les contenus des requêtes et réponses.
La navigation privée permet de simuler une première connexion à l’application, sans conserver des cookies précédemment enregistrés par le navigateur, donc de faire session de navigation complètement nouvelle.
Examinez la génération du cookie transmis par le serveur PHP lors de la première soumission d’un formulaire, de création par exemple, qui active le code qui fait appel à un flashbag.
Ce cookie est généré par l’en-tête
Set-Cookie
présent dans la réponse à la requête POST.- Vérifiez dans la barre d’outils Symfony : la session Symfony contient bien les messages flash en attente (onglet Flashes de l’outil « Request/Response »)
Vous pouvez comparer le comportement de l’affichage des message via dump()
, qui sont,
eux, masqués par les redirections survenant après les POST, et les
messages flash, mis en attente, pour être affichés à la fin de la redirection