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
appfournie 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 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.
Plus de détails pour les messages flash ici.
appLa 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.