<?php
namespace App\EventListener;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/**
* Class ExceptionSubscriber
*
* @package App\EventListener
*/
class ExceptionSubscriber implements EventSubscriberInterface
{
/**
* @var SessionInterface $session
*/
private $session;
/**
* @var LoggerInterface
*/
private $logger;
/**
* ExceptionSubscriber constructor.
*
* @param SessionInterface $session
* @param LoggerInterface $logger
*/
public function __construct(SessionInterface $session, LoggerInterface $logger)
{
$this->session = $session;
$this->logger = $logger;
}
/**
* @param GetResponseForExceptionEvent $event
*/
public function onKernelHandleException(GetResponseForExceptionEvent $event)
{
$exception = $event->getException();
$referer = $event->getRequest()->headers->get('referer');
$currentUri = $event->getRequest()->getRequestUri();
if (!($exception instanceof NotFoundHttpException) && getenv('APP_ENV') !== 'dev') {
$this
->session
->getFlashBag()
->add('error', $exception->getMessage());
$this
->logger
->critical($exception->getMessage(), $exception->getTrace());
$response = new RedirectResponse('/');
$pos = strpos($referer, $currentUri);
if ($referer && $pos !== false) {
$response->headers->set('location', $referer);
}
$event->setResponse($response);
}
}
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return [
'kernel.exception' => 'onKernelHandleException'
];
}
}