<?php
declare(strict_types=1);
namespace App\Event\Subscriber\Admin;
use App\Service\Admin\CrudFlashMessage\PublisherInterface;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterCrudActionEvent;
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\Form\Form;
use Symfony\Component\HttpFoundation\RequestStack;
class CrudFlashMessage implements EventSubscriberInterface
{
private PublisherInterface $publisher;
private RequestStack $requestStack;
/**
* CrudFlashMessage constructor.
*/
public function __construct(PublisherInterface $publisher, RequestStack $requestStach)
{
$this->publisher = $publisher;
$this->requestStack = $requestStach;
}
public static function getSubscribedEvents()
{
return [
AfterEntityUpdatedEvent::class => ['onAfterUpdated'],
AfterEntityPersistedEvent::class => ['onAfterPersisted'],
AfterEntityDeletedEvent::class => ['onAfterDeleted'],
AfterCrudActionEvent::class => ['onAfterCrudAction'],
];
}
public function onAfterUpdated(AfterEntityUpdatedEvent $event): void
{
$request = $this->requestStack->getMainRequest();
if ($request && !$request->isXmlHttpRequest()) {
$this->publisher->publishForUpdated($event->getEntityInstance());
}
}
public function onAfterPersisted(AfterEntityPersistedEvent $event): void
{
$request = $this->requestStack->getMainRequest();
if ($request && !$request->isXmlHttpRequest()) {
$this->publisher->publishForPersisted($event->getEntityInstance());
}
}
public function onAfterDeleted(AfterEntityDeletedEvent $event): void
{
$request = $this->requestStack->getMainRequest();
if ($request && !$request->isXmlHttpRequest()) {
$this->publisher->publishForDeleted($event->getEntityInstance());
}
}
public function onAfterCrudAction(AfterCrudActionEvent $event): void
{
$params = $event->getResponseParameters();
if (!$params) {
return;
}
$form = null;
foreach ($params->all() as $key => $value) {
if (!$value instanceof Form) {
continue;
}
if ($value->isSubmitted() && !$value->isValid()) {
$this->publisher->publishForValidationError($value->getData());
break;
}
}
}
}