src/EventSubscriber/ApiErrorHandlingSubscriber.php line 43

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventSubscriber;
  4. use App\Controller\Response\MicroServiceApiResponse;
  5. use App\Utils\RequestHelper;
  6. use App\Domain\Payload\Error;
  7. use App\Exception\ApiException;
  8. use App\Domain\Payload\Payload;
  9. use App\Domain\Payload\ErrorCollection;
  10. use Symfony\Component\HttpKernel\KernelEvents;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use App\Controller\Response\GetPayloadInterface;
  13. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  14. use App\Controller\Response\ValidationErrorApiResponse;
  15. use App\Services\ErrorHandling\ApiErrorResponseHandler;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. use InvalidArgumentException;
  18. class ApiErrorHandlingSubscriber implements EventSubscriberInterface
  19. {
  20.     /**
  21.      * @var RequestHelper
  22.      */
  23.     private $requestHelper;
  24.     /**
  25.      * @var ApiErrorResponseHandler
  26.      */
  27.     private $errorResponseHandler;
  28.     public function __construct(RequestHelper $requestHelperApiErrorResponseHandler $errorResponseHandler)
  29.     {
  30.         $this->requestHelper $requestHelper;
  31.         $this->errorResponseHandler $errorResponseHandler;
  32.     }
  33.     /**
  34.      * @throws InvalidArgumentException
  35.      */
  36.     public function onKernelResponse(ResponseEvent $event): void
  37.     {
  38.         $response $event->getResponse();
  39.         if ($this->requestHelper->isV1Route()) {
  40.             return;
  41.         }
  42.         if ($response instanceof MicroServiceApiResponse) {
  43.             return;
  44.         }
  45.         if ($response instanceof GetPayloadInterface && $response->getPayload()->hasError()) {
  46.             $payload $response->getPayload();
  47.             $error $payload->getError();
  48.             if ($error instanceof Error && $error->getData() instanceof ErrorCollection) {
  49.                 $payload->setErrors($error->getData()->getErrors());
  50.             }
  51.             $event->setResponse(
  52.                 $this->errorResponseHandler->handle(
  53.                     ApiException::createBusinessLogicException($payload)
  54.                 )
  55.             );
  56.             return;
  57.         }
  58.         if ($response instanceof ValidationErrorApiResponse) {
  59.             $response->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY);
  60.             $event->setResponse($response);
  61.             return;
  62.         }
  63.         if ($response instanceof Response && $response->getStatusCode() === Response::HTTP_UNAUTHORIZED) {
  64.             $content json_decode($response->getContent() ?? '{}'true);
  65.             $payload = new Payload();
  66.             $payload->setError(new Error(0$content['error_description'] ?? 'OAuth2 authentication required'));
  67.             $event->setResponse(
  68.                 $this->errorResponseHandler->handle(
  69.                     ApiException::createUnauthorizedException($payload)
  70.                 )
  71.             );
  72.         }
  73.     }
  74.     public static function getSubscribedEvents(): array
  75.     {
  76.         return [
  77.             KernelEvents::RESPONSE => ['onKernelResponse'2],
  78.         ];
  79.     }
  80. }