Jonathan Scheiber

EasyAdmin bundle : message flash après sauvegarde

Temps de lecture : 3 minutes 2 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 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.

Ajouter un commentaire