src/EventSubscriber/ApiExceptionSubscriber.php line 23

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpFoundation\JsonResponse;
  5. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  6. use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
  7. use Symfony\Component\HttpKernel\KernelEvents;
  8. /**
  9.  * Converts exceptions thrown inside /api/v1/* into the uniform JSON error envelope.
  10.  */
  11. class ApiExceptionSubscriber implements EventSubscriberInterface
  12. {
  13.     public static function getSubscribedEvents(): array
  14.     {
  15.         return [
  16.             KernelEvents::EXCEPTION => ['onException'0],
  17.         ];
  18.     }
  19.     public function onException(ExceptionEvent $event): void
  20.     {
  21.         $request $event->getRequest();
  22.         if (!str_starts_with($request->getPathInfo(), '/api/v1')) {
  23.             return;
  24.         }
  25.         $ex $event->getThrowable();
  26.         if ($ex instanceof HttpExceptionInterface) {
  27.             $status $ex->getStatusCode();
  28.             $code = match (true) {
  29.                 $status === 404 => 'NOT_FOUND',
  30.                 $status === 405 => 'METHOD_NOT_ALLOWED',
  31.                 $status === 400 => 'BAD_REQUEST',
  32.                 $status === 413 => 'FILE_TOO_LARGE',
  33.                 $status === 415 => 'UNSUPPORTED_MEDIA_TYPE',
  34.                 $status === 422 => 'VALIDATION_FAILED',
  35.                 $status >= 500 => 'INTERNAL_ERROR',
  36.                 default => 'ERROR',
  37.             };
  38.             $message $ex->getMessage() ?: 'Er is iets misgegaan.';
  39.         } else {
  40.             $status 500;
  41.             $code 'INTERNAL_ERROR';
  42.             $message 'Er is een interne fout opgetreden.';
  43.         }
  44.         $event->setResponse(new JsonResponse([
  45.             'error' => [
  46.                 'code' => $code,
  47.                 'message' => $message,
  48.             ],
  49.         ], $status));
  50.     }
  51. }