<?php
namespace App\EventSubscriber;
use EasyCorp\Bundle\EasyAdminBundle\Provider\AdminContextProvider;
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class PDOExceptionSubscriber implements EventSubscriberInterface
{
public function __construct(private SessionInterface $session, private AdminContextProvider $adminContextProvider, private AdminUrlGenerator $adminUrlGenerator)
{
}
public static function getSubscribedEvents() {
return [ KernelEvents::EXCEPTION => ['onKernelException'] ];
}
public function sendFlashPrimary ($title = "", $message = "") { return $this->sendFlash("primary", $title, $message); }
public function sendFlashSecondary($title = "", $message = "") { return $this->sendFlash("secondary", $title, $message); }
public function sendFlashDark ($title = "", $message = "") { return $this->sendFlash("dark", $title, $message); }
public function sendFlashLight ($title = "", $message = "") { return $this->sendFlash("light", $title, $message); }
public function sendFlashSuccess ($title = "", $message = "") { return $this->sendFlash("success", $title, $message); }
public function sendFlashInfo ($title = "", $message = "") { return $this->sendFlash("info", $title, $message); }
public function sendFlashNotice ($title = "", $message = "") { return $this->sendFlash("notice", $title, $message); }
public function sendFlashWarning ($title = "", $message = "") { return $this->sendFlash("warning", $title, $message); }
public function sendFlashDanger ($title = "", $message = "") { return $this->sendFlash("danger", $title, $message); }
public function sendFlash($type, $title = "", $message = "")
{
if($title instanceof ExceptionEvent) {
$event = $title;
$exception = $event->getThrowable();
$title = $exception::class."<br/>";
$title .= "(".$exception->getFile().":".$exception->getLine().")";
$message = $exception->getMessage();
}
if(!empty($title)) $title = "<b>".$title."</b><br/>";
if(!empty($title.$message))
$this->session->getFlashBag()->add($type, $title.$message);
}
public function onKernelException(ExceptionEvent $event)
{
// Check if exception happened in EasyAdmin (avoid warning outside EA)
if(!$this->adminContextProvider) return;
if(!$this->adminContextProvider->getContext()) return;
// Get back exception & send flash message
$this->sendFlashDanger($event);
// Get back crud information
$crud = $this->adminContextProvider->getContext()->getCrud();
if(!$crud) return;
$controller = $crud->getControllerFqcn();
$action = $crud->getCurrentPage();
// Avoid infinite redirection
// - If exception happened in "index", redirect to dashboard
// - If exception happened in an other section, redirect to index page first
// - If exception happened after submitting a form, just redirect to the initial page
$url = $this->adminUrlGenerator->unsetAll();
switch($action) {
case "index": break;
default:
$url = $url->setController($controller);
if(isset($_POST) && !empty($_POST)) $url = $url->setAction($action);
}
$event->setResponse(new RedirectResponse($url));
}
}