<?php
namespace App;
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpKernel\Kernel as BaseKernel;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Throwable;
class Kernel extends BaseKernel
{
use MicroKernelTrait;
public function handle(Request $request, int $type = self::MAIN_REQUEST, bool $catch = true): Response
{
try {
return parent::handle($request, $type, false);
} catch (Throwable $exception) {
$statusCode = match (true) {
$exception instanceof HttpExceptionInterface => $exception->getStatusCode(),
$exception instanceof AccessDeniedException => Response::HTTP_FORBIDDEN,
$exception instanceof AuthenticationException => Response::HTTP_UNAUTHORIZED,
method_exists($exception, 'getStatusCode') => $exception->getStatusCode(),
default => Response::HTTP_INTERNAL_SERVER_ERROR,
};
$exposeMessage = $this->getEnvironment() === 'dev';
$response = [
'message' => $exposeMessage
? $exception->getMessage()
: 'An error occurred',
'code' => $statusCode
];
if ($exposeMessage) {
$response['error']['file'] = $exception->getFile();
$response['error']['line'] = $exception->getLine();
$response['error']['trace'] = $exception->getTraceAsString();
}
return new JsonResponse($response, $statusCode);
}
}
}