<?php
/**
* User: Mykola Zots
* Date: 2025-09-12
* Time: 08:42
*/
namespace App\Subscriber;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class ExceptionSubscriber implements EventSubscriberInterface
{
private $requestStack;
private $urlGenerator;
private $flashBag;
private $translator;
public function __construct(RequestStack $requestStack, UrlGeneratorInterface $urlGenerator,TranslatorInterface $translator, FlashBagInterface $flashBag) {
$this->urlGenerator=$urlGenerator;
$this->requestStack=$requestStack;
$this->flashBag=$flashBag;
$this->translator=$translator;
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::EXCEPTION => 'onKernelException',
];
}
public function onKernelException(ExceptionEvent $event): void
{
$exception = $event->getThrowable();
$request = $event->getRequest();
if ($exception instanceof \Symfony\Component\HttpKernel\Exception\BadRequestHttpException) {
// Обмежимося адмінськими роутами (налаштуйте під себе)
$isAdmin = str_starts_with((string) $request->attributes->get('_route', ''), 'dashboard');
if ($isAdmin) {
$this->flashBag->add('danger', $this->translator->trans($exception->getMessage()));
$backUrl = $request->headers->get('referer') ?$request->headers->get('referer'): $this->urlGenerator->generate('admin');
$event->setResponse(new RedirectResponse($backUrl));
}else{
$response = new JsonResponse([
$exception->getMessage()
], 400);
$event->setResponse($response);
}
}
}
}