app/GraphQL/EventSubscriber/GraphQLExceptionSubscriber.php line 32

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Sq\GraphQL\EventSubscriber;
  3. use Sq\GraphQL\Exception\SqGraphQLException;
  4. use Sq\Service\Environment;
  5. use Sq\Service\Log\ExceptionLogger;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpFoundation\JsonResponse;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  10. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  11. use Symfony\Component\HttpKernel\KernelEvents;
  12. use Symfony\Component\Routing\Exception\ResourceNotFoundException;
  13. class GraphQLExceptionSubscriber implements EventSubscriberInterface
  14. {
  15.     public function __construct(
  16.         protected Environment $environment,
  17.         protected ExceptionLogger $exceptionLogger,
  18.     ) {
  19.     }
  20.     /** @inheritDoc */
  21.     public static function getSubscribedEvents(): array
  22.     {
  23.         return [
  24.             KernelEvents::EXCEPTION => ['onException'],
  25.         ];
  26.     }
  27.     public function onException(ExceptionEvent $event): void
  28.     {
  29.         $throwable $event->getThrowable();
  30.         is_graphql_request($event->getRequest()) && $event->setResponse(static::createInternalServerErrorGraphQLResponse($this->environment->isDebug(), $throwable));
  31.         if ($throwable instanceof NotFoundHttpException || $throwable instanceof ResourceNotFoundException)
  32.         {
  33.             return;
  34.         }
  35.         $this->exceptionLogger->logInternalServerError($event->getThrowable());
  36.     }
  37.     public static function createInternalServerErrorGraphQLResponse($debug false, ?\Throwable $e null): Response
  38.     {
  39.         $error = new \GraphQL\Error\Error("INTERNAL_SERVER_ERROR");
  40.         $res = new \GraphQL\Executor\ExecutionResult(null, [$error]);
  41.         $resArray $res->toArray();
  42.         if ($e instanceof SqGraphQLException)
  43.         {
  44.             $resArray['errors'][0]['extensions']['gql_message'] = $e->getMessage();
  45.         }
  46.         if ($debug && $e)
  47.         {
  48.             if ($e->getPrevious())
  49.             {
  50.                 $previous $e->getPrevious();
  51.                 $resArray['errors'][0]['debug_previous'] = [
  52.                     'message' => $previous->getMessage(),
  53.                     'code' => $previous->getCode(),
  54.                     'line' => $previous->getLine(),
  55.                     'file' => $previous->getFile(),
  56.                 ];
  57.             }
  58.             $resArray['errors'][0]['debug_message'] = $e->getMessage();
  59.             $resArray['errors'][0]['debug_file'] = $e->getFile();
  60.             $resArray['errors'][0]['debug_line'] = $e->getLine();
  61.             $resArray['errors'][0]['debug_trace'] = $e->getTraceAsString();
  62.         }
  63.         return new JsonResponse($resArray500);
  64.     }
  65. }