src/EventSubscriber/PDOExceptionSubscriber.php line 51

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use EasyCorp\Bundle\EasyAdminBundle\Provider\AdminContextProvider;
  4. use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  8. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  9. use Symfony\Component\HttpKernel\KernelEvents;
  10. class PDOExceptionSubscriber implements EventSubscriberInterface
  11. {
  12.     public function __construct(private SessionInterface $session, private AdminContextProvider $adminContextProvider, private AdminUrlGenerator $adminUrlGenerator)
  13.     {
  14.     }
  15.     public static function getSubscribedEvents() {
  16.         return [ KernelEvents::EXCEPTION => ['onKernelException'] ];
  17.     }
  18.     public function sendFlashPrimary  ($title ""$message "") { return $this->sendFlash("primary",   $title$message); }
  19.     public function sendFlashSecondary($title ""$message "") { return $this->sendFlash("secondary"$title$message); }
  20.     public function sendFlashDark     ($title ""$message "") { return $this->sendFlash("dark",      $title$message); }
  21.     public function sendFlashLight    ($title ""$message "") { return $this->sendFlash("light",     $title$message); }
  22.     public function sendFlashSuccess  ($title ""$message "") { return $this->sendFlash("success",   $title$message); }
  23.     public function sendFlashInfo     ($title ""$message "") { return $this->sendFlash("info",      $title$message); }
  24.     public function sendFlashNotice   ($title ""$message "") { return $this->sendFlash("notice",    $title$message); }
  25.     public function sendFlashWarning  ($title ""$message "") { return $this->sendFlash("warning",   $title$message); }
  26.     public function sendFlashDanger   ($title ""$message "") { return $this->sendFlash("danger",    $title$message); }
  27.     public function sendFlash($type$title ""$message "")
  28.     {
  29.         if($title instanceof ExceptionEvent) {
  30.             $event     $title;
  31.             $exception $event->getThrowable();
  32.             $title   $exception::class."<br/>";
  33.             $title  .= "(".$exception->getFile().":".$exception->getLine().")";
  34.             $message $exception->getMessage();
  35.         }
  36.         if(!empty($title)) $title "<b>".$title."</b><br/>";
  37.         if(!empty($title.$message))
  38.             $this->session->getFlashBag()->add($type$title.$message);
  39.     }
  40.     public function onKernelException(ExceptionEvent $event)
  41.     {
  42.         // Check if exception happened in EasyAdmin (avoid warning outside EA)
  43.         if(!$this->adminContextProvider) return;
  44.         if(!$this->adminContextProvider->getContext()) return;
  45.         // Get back exception & send flash message
  46.         $this->sendFlashDanger($event);
  47.         // Get back crud information
  48.         $crud       $this->adminContextProvider->getContext()->getCrud();
  49.         if(!$crud) return;
  50.         $controller $crud->getControllerFqcn();
  51.         $action     $crud->getCurrentPage();
  52.         // Avoid infinite redirection
  53.         // - If exception happened in "index", redirect to dashboard
  54.         // - If exception happened in an other section, redirect to index page first
  55.         // - If exception happened after submitting a form, just redirect to the initial page
  56.         $url $this->adminUrlGenerator->unsetAll();
  57.         switch($action) {
  58.             case "index": break;
  59.             default:
  60.                 $url $url->setController($controller);
  61.                 if(isset($_POST) && !empty($_POST)) $url $url->setAction($action);
  62.         }
  63.         $event->setResponse(new RedirectResponse($url));
  64.     }
  65. }