Aller au contenu principal

Les messages flash

Dans n'importe quel contrôleur héritant de la classe AbstractController, nous disposons de méthodes utilitaires nous permettant par exemple de rediriger l'utilisateur vers une nouvelle page (redirectToRoute), rendre un template (render), rendre un template contenant un formulaire (renderForm), etc...

Lors de la réalisation d'un formulaire, il est toujours utile d'assurer un retour à l'utilisateur, sous forme de message, ou notification.

Un système mis à disposition par Symfony, et largement utilisé dans le cas des formulaires, est celui des messages flash.

Principe​

Les messages flash ont un fonctionnement très simple :

  • Lorsqu'on ajoute un message flash depuis un contrôleur, celui-ci s'ajoute en session
  • Si on souhaite afficher un message flash dans un template Twig, on peut utiliser la variable globale app fournie par Symfony
  • Une fois le message affiché, il est automatiquement supprimé. C'est donc idéal pour l'affichage de notifications, qui n'ont besoin d'être consommées qu'une fois

On peut ajouter un message avec n'importe quel type, pour le classer dans une catégorie ou une autre.

Enregistrement​

Exemple complet issu de notre formulaire d'enregistrement de newsletter :

src/Controller/NewsletterController.php

public function register(
Request $request,
EntityManagerInterface $em
): Response {
$newsletter = new Newsletter();
$form = $this->createForm(NewsletterType::class, $newsletter);

$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$newsletter->setCreated(new DateTime());
$em->persist($newsletter);
$em->flush();
$this->addFlash('success', 'Votre email a été enregistré, merci');
return $this->redirectToRoute('app_index');
}

return $this->renderForm('newsletter/register.html.twig', [
'form' => $form
]);
}

Dans un premier temps, on enregistre un message flash. Il va donc être inscrit en session.

Affichage​

Dans un second temps (voir ci-dessous), dans un template, on va utiliser la variable app et plus précisément app.flashes, pour accéder aux messages flash :

templates/base.html.twig

{# FLASH MESSAGES #}
{% for type, messages in app.flashes(['success', 'info', 'warning', 'danger']) %}
{% for message in messages %}
<div class="alert alert-{{ type }}" role="alert">
{{ message }}
</div>
{% endfor %}
{% endfor %}
La boucle Twig for

La syntaxe utilisée ici permet d'extraire le type en tant que clé et les messages associés en tant que valeur. Les types utilisés ici sont donc calqués sur les types d'alertes se trouvant dans Bootstrap.

Documentation Twig

Plus de détails pour les messages flash ici.

La variable app

La variable app, utilisée dans des templates Twig, est en fait ajoutée par Symfony pour nous permettre d'accéder facilement à des éléments internes de Symfony. Quand on utilise Twig sans Symfony, elle n'existe pas.

Plus de détails sur la variable app ici.