vendor/appaydin/pd-api/Listener/ExceptionListener.php line 32

Open in your IDE?
  1. <?php
  2. /**
  3.  * This file is part of the pd-admin pd-api package.
  4.  *
  5.  * @package     pd-api
  6.  * @license     LICENSE
  7.  * @author      Ramazan APAYDIN <apaydin541@gmail.com>
  8.  * @link        https://github.com/appaydin/pd-api
  9.  */
  10. namespace Pd\ApiBundle\Listener;
  11. use Pd\ApiBundle\PdApiBundle;
  12. use Pd\ApiBundle\Services\AcceptContentType;
  13. use ReflectionClass;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  17. use Symfony\Component\HttpKernel\KernelEvents;
  18. use Symfony\Component\Serializer\SerializerInterface;
  19. use Symfony\Contracts\Translation\TranslatorInterface;
  20. class ExceptionListener implements EventSubscriberInterface
  21. {
  22.     public function __construct(private SerializerInterface $serializer,
  23.                                 private TranslatorInterface $translator,
  24.                                 private AcceptContentType $accept)
  25.     {
  26.     }
  27.     public function onKernelException(ExceptionEvent $event): void
  28.     {
  29.         $request $event->getRequest();
  30.         if (!$request->attributes->get(PdApiBundle::ZONE_ATTRIBUTE)) {
  31.             return;
  32.         }
  33.         // Create Exception Message
  34.         $exception $event->getThrowable();
  35.         $statusCode method_exists($exception'getStatusCode') ? $exception->getStatusCode() : $exception->getCode();
  36.         $error = [
  37.             'message' => $this->translator->trans($exception->getMessage(), [], 'exception'),
  38.             'code' => $statusCode ?: 500,
  39.             'type' => (new ReflectionClass($exception))->getShortName(),
  40.         ];
  41.         // Replace Response
  42.         $response = (new Response())
  43.             ->setContent($this->serializer->serialize($error$this->accept->getAcceptType()))
  44.             ->setStatusCode($error['code']);
  45.         $response->headers->set('Content-Type''application/'.$this->accept->getAcceptType());
  46.         $event->setResponse($response);
  47.     }
  48.     public static function getSubscribedEvents(): array
  49.     {
  50.         return [KernelEvents::EXCEPTION => [['onKernelException'50]]];
  51.     }
  52. }