<?php
namespace App\EventListener;
use App\Service\MailService;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Security;
class ExceptionListener
{
private $flashBag;
private $router;
public function __construct(RouterInterface $router, Security $security, RequestStack $request_stack, MailService $mail_service)
{
$this->flashBag = $request_stack->getSession()->getFlashBag();
$this->router = $router;
$this->security = $security;
$this->mail_service = $mail_service;
}
public function onKernelException(ExceptionEvent $event)
{
$this->flashBag->clear();
$exception = $event->getThrowable();
$message = sprintf(
'My Error says: %s with code: %s',
$exception->getMessage(),
$exception->getCode()
);
$content = $message;
$response = new Response();
$response->setContent($message);
if ($exception instanceof HttpExceptionInterface) {
$response->setStatusCode($exception->getStatusCode());
$response->headers->replace($exception->getHeaders());
}else if($exception->getCode() == 403){
$response->setStatusCode($exception->getCode());
} else {
$response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR);
}
$event->setResponse($response);
$this->flashBag->add(
'code',
$response->getStatusCode()
);
if($event->getRequest()->isXmlHttpRequest()){
$this->mail_service->send_single_email("nicolas.deboise@spontaneit.fr", "ERREUR - Webqualite ".$event->getResponse()->getStatusCode(), $content);
switch($event->getResponse()->getStatusCode()){
case 403:
$event->setResponse(new Response(null, 403));
break;
case 500:
$event->setResponse(new Response(null, 500));
break;
default:
$event->setResponse(new JsonResponse(array('success' => false, 'message' => "Une erreur est survenue")));
break;
}
}else{
switch($event->getResponse()->getStatusCode()){
case 403:
if($this->security->getUser() != null){
$response = new RedirectResponse($this->router->generate('forbidden_access'));
$event->setResponse($response);
}else{
$response = new RedirectResponse($this->router->generate('login'));
$event->setResponse($response);
}
break;
default:
$this->mail_service->send_single_email("nicolas.deboise@spontaneit.fr", "ERREUR - Webqualite ".$event->getResponse()->getStatusCode(), $content);
$this->flashBag->add(
'erreur',
$exception->getMessage()
);
$this->flashBag->add(
'referer',
$event->getRequest()->getUri()
);
$this->flashBag->add(
'line',
$exception->getLine()
);
$response = new RedirectResponse($this->router->generate('custom_error', array('_locale' => ($event->getRequest()->get('_locale')!=null)?$event->getRequest()->get('_locale'):$event->getRequest()->getDefaultLocale())));
$event->setResponse($response);
break;
}
}
}
}