<?php
/**
* Created by IntelliJ IDEA.
* User: dogukan
* Date: 2019-01-24
* Time: 21:24
*/
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException;
use Symfony\Component\Security\Core\Exception\ExceptionInterface as SecurityCoreExceptionInterface;
use Symfony\Component\Serializer\SerializerInterface;
/**
* Class ExceptionSubscriber
* @package App\EventSubscriber
*/
class ExceptionSubscriber implements EventSubscriberInterface
{
/**
* @var SerializerInterface
*/
private $serializer;
/**
* ExceptionSubscriber constructor.
* @param SerializerInterface $serializer
*/
public function __construct(SerializerInterface $serializer)
{
$this->serializer = $serializer;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return [
KernelEvents::EXCEPTION => [
['processException', 10]
]
];
}
/**
* @param GetResponseForExceptionEvent $event
*/
public function processException(GetResponseForExceptionEvent $event)
{
$statusCode = Response::HTTP_INTERNAL_SERVER_ERROR;
$headers = [];
$exception = $event->getException();
if($exception instanceof HttpExceptionInterface) {
$statusCode = $exception->getStatusCode();
$headers = $exception->getHeaders();
}
else if($exception instanceof SecurityCoreExceptionInterface) {
if($exception->getCode() >= 400) {
$statusCode = $exception->getCode();
}
else if($exception instanceof AuthenticationCredentialsNotFoundException) {
$statusCode = Response::HTTP_UNAUTHORIZED;
}
}
$response = new JsonResponse(
[ 'error' => $this->serializer->normalize($exception, 'json') ],
$statusCode,
$headers
);
$event->setResponse($response);
}
}