src/Shared/Infrastructure/Persistence/Listeners/ExceptionListener.php line 17

Open in your IDE?
  1. <?php
  2. namespace App\Shared\Infrastructure\Persistence\Listeners;
  3. use Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException;
  4. use Sonata\AdminBundle\Exception\ModelManagerException;
  5. use Symfony\Component\HttpFoundation\RedirectResponse;
  6. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  7. use Symfony\Contracts\Translation\TranslatorInterface;
  8. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  9. class ExceptionListener
  10. {
  11.     public function __construct(private TranslatorInterface $translator, private SessionInterface $session)
  12.     { }
  13.     public function onKernelException(ExceptionEvent $event)
  14.     {
  15.         $exception $event->getThrowable();
  16.         if ($exception instanceof ModelManagerException and $exception->getPrevious() instanceof ForeignKeyConstraintViolationException) {
  17.             $message $this->translator->trans('error.entity_in_use', [], 'admin');
  18.             // Añade el mensaje flash
  19.             $this->session->getFlashBag()->add('error'$message." ({$exception->getMessage()})");
  20.             // Obtiene la página anterior del encabezado 'referer'
  21.             $referer $event->getRequest()->headers->get('referer');
  22.             // Si no hay referer (por ejemplo, si la petición es directa), puedes redirigir a una página predeterminada
  23.             if ($referer === null) {
  24.                 $referer '/';  // o cualquier ruta predeterminada
  25.             }
  26.             // Crea una respuesta de redirección a la página anterior
  27.             $response = new RedirectResponse($referer);
  28.             $event->setResponse($response);
  29.         }
  30.     }
  31. }