Jonathan Scheiber

EasyAdmin bundle : message flash après sauvegarde

Temps de lecture : 3 minutes 10 commentaires
EasyAdmin bundle : message flash après sauvegarde

Par défaut, en créant du contenu, EasyAdmin n'affiche aucun message après la création, la modification ou la suppression d'une entité. Voyons comment faire en sorte d'en avoir :)

Vous pouvez voir un exemple dans l'image de présentation de l'article.

Le but de cet article va être d'automatiser ces messages flash avec le minimum de code possible.

Quelques explications avant de commencer

Le code a été testé avec PHP 8.0, Symfony 5.2 et EasyAdmin bundle 3.2.8. Il se base sur les faits suivants :

Le code

<?php

declare(strict_types=1);

namespace App\Listener;

use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityDeletedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityPersistedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityUpdatedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Translation\TranslatableMessage;

final class EasyAdminListener implements EventSubscriberInterface
{
    public function __construct(private SessionInterface $session)
    {
    }

    public static function getSubscribedEvents(): array
    {
        return [
            AfterEntityPersistedEvent::class => ['flashMessageAfterPersist'],
            AfterEntityUpdatedEvent::class => ['flashMessageAfterUpdate'],
            AfterEntityDeletedEvent::class => ['flashMessageAfterDelete'],
        ];
    }

    public function flashMessageAfterPersist(AfterEntityPersistedEvent $event): void
    {
        $this->session->getFlashBag()->add('success', new TranslatableMessage('content_admin.flash_message.create', [
            '%name%' => (string) $event->getEntityInstance(),
        ], 'admin'));
    }

    public function flashMessageAfterUpdate(AfterEntityUpdatedEvent $event): void
    {
        $this->session->getFlashBag()->add('success', new TranslatableMessage('content_admin.flash_message.update', [
            '%name%' => (string) $event->getEntityInstance(),
        ], 'admin'));
    }

    public function flashMessageAfterDelete(AfterEntityDeletedEvent $event): void
    {
        $this->session->getFlashBag()->add('success', new TranslatableMessage('content_admin.flash_message.delete', [
            '%name%' => (string) $event->getEntityInstance(),
        ], 'admin'));
    }
}
# Traductions, placées dans translations/admin.fr.yaml
content_admin:
    flash_message:
        create: Le contenu "%name%" a été créé avec succès.
        update: Le contenu "%name%" a été mis à jour avec succès.
        delete: Le contenu "%name%" a été supprimé avec succès.

Comment ça fonctionne ?

Le listener va écouter sur les trois événements d'EasyAdmin prévenant qu'une entité Doctrine a été créée, mise à jour ou supprimée. Chacun de ces événements a accès à l'entité impactée via la méthode getEntityInstance() disponible sur l'événement.

A partir de là, un message flash est enregistré en session, en passant en paramètre du message flash la valeur renvoyée par la méthode __toString() de l'entité.

A partir du moment où l'autoconfigure est activé dans votre projet, c'est fini ! Vous avez vos beaux messages flash qui s'affichent quand vous sauvegardez une entité.

Et voilà, c'est terminé ! :) Si vous avez des questions, remarques, suggestions ... N'hésitez pas à poster un commentaire ci-dessous :)

Commentaires

Posté par Robin Bastiaan le 25/04/2021 à 13:32.
Elegant solution I will use for sure. Thanks for sharing!
Posté par wietsedc le 26/04/2021 à 09:57.
thanks! details like this make the user experience so much better, I implemented it straight away.
Posté par ced le 08/05/2021 à 16:12.
Bonjour,

J'ai une erreur concernant e constructeur
public function __construct(private SessionInterface $session)
{
}

private me donne une erreur
Posté par jmsche le 09/05/2021 à 18:02.
Bonjour ced, si tu pouvais donner l'erreur ça pourrait être intéressant pour t'aider :)
Posté par Robin Bastiaan le 10/05/2021 à 10:08.
@ced, please let me help you although I only speak English. I suspect you are not running PHP version 8. A new way of writing a constructor was introduced in PHP8 and is called "constructor property promotion". Please try the following code instead:

private SessionInterface $session;

public function __construct(SessionInterface $session)
{
$this->session = $session;
}
Posté par ced le 24/05/2021 à 23:17.
Merci @Robin Bastiaan pour ton indication. J'utilise un switch checkbox et l'ors de la modification sur on ou off je ne reçois pas de message flash car je ne change pas de page.Comment faire pour résoudre ce problème et affiché directement le message?
Posté par DooM le 27/05/2021 à 14:00.
I tried this with php 7.4.9, used the tip from @Robin Bastiaan and ended with this error:
Expected to find class "App\EventSubscriber\EasyAdminListener" in file "$$$$\src\EventSubscriber\EasyAdminListener.php" while importing services from resource "../src/", but it was not found! Check the namespace prefix used with the resource in $$$$\src\../config/services.yaml (which is being imported from "$$$$\src\Kernel.php").
I'm kind of beginner with symfony5
Posté par jmsche le 27/05/2021 à 14:07.
Hi DooM, could you please create a Gist with the code of your listener? Also, make sure the namespace+classname match the filepath (case sensitive).
Posté par DooM le 27/05/2021 à 14:56.
Hi jmsche, it's just the same as your. I managed to "solve" the path problem, no more error, but still no flash message displayed. I guess i should take more time reading doc...
Posté par jmsche le 27/05/2021 à 14:56.
Feel free to contact me on Symfony's Slack by DM :)

Ajouter un commentaire