<?php
namespace App\Shared\Infrastructure\Persistence\Listeners;
use Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException;
use Sonata\AdminBundle\Exception\ModelManagerException;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class ExceptionListener
{
public function __construct(private TranslatorInterface $translator, private SessionInterface $session)
{ }
public function onKernelException(ExceptionEvent $event)
{
$exception = $event->getThrowable();
if ($exception instanceof ModelManagerException and $exception->getPrevious() instanceof ForeignKeyConstraintViolationException) {
$message = $this->translator->trans('error.entity_in_use', [], 'admin');
// Añade el mensaje flash
$this->session->getFlashBag()->add('error', $message." ({$exception->getMessage()})");
// Obtiene la página anterior del encabezado 'referer'
$referer = $event->getRequest()->headers->get('referer');
// Si no hay referer (por ejemplo, si la petición es directa), puedes redirigir a una página predeterminada
if ($referer === null) {
$referer = '/'; // o cualquier ruta predeterminada
}
// Crea una respuesta de redirección a la página anterior
$response = new RedirectResponse($referer);
$event->setResponse($response);
}
}
}