vendor/ibexa/rest/src/bundle/EventListener/ResponseListener.php line 57

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4.  * @license For full copyright and license information view LICENSE file distributed with this source code.
  5.  */
  6. namespace Ibexa\Bundle\Rest\EventListener;
  7. use Ibexa\Rest\Server\View\AcceptHeaderVisitorDispatcher;
  8. use Psr\Log\LoggerAwareInterface;
  9. use Psr\Log\LoggerAwareTrait;
  10. use Psr\Log\LogLevel;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  13. use Symfony\Component\HttpKernel\Event\ViewEvent;
  14. use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
  15. use Symfony\Component\HttpKernel\KernelEvents;
  16. use Throwable;
  17. /**
  18.  * REST Response Listener.
  19.  *
  20.  * Converts responses from REST controllers to REST Responses, depending on the Accept-Header value.
  21.  */
  22. class ResponseListener implements EventSubscriberInterfaceLoggerAwareInterface
  23. {
  24.     use LoggerAwareTrait;
  25.     /**
  26.      * @var \Ibexa\Rest\Server\View\AcceptHeaderVisitorDispatcher
  27.      */
  28.     private $viewDispatcher;
  29.     /**
  30.      * @param $viewDispatcher AcceptHeaderVisitorDispatcher
  31.      */
  32.     public function __construct(AcceptHeaderVisitorDispatcher $viewDispatcher)
  33.     {
  34.         $this->viewDispatcher $viewDispatcher;
  35.     }
  36.     /**
  37.      * @return array
  38.      */
  39.     public static function getSubscribedEvents()
  40.     {
  41.         return [
  42.             KernelEvents::VIEW => 'onKernelResultView',
  43.             // Must happen BEFORE the Core ExceptionListener.
  44.             KernelEvents::EXCEPTION => ['onKernelExceptionView'20],
  45.         ];
  46.     }
  47.     /**
  48.      * @param \Symfony\Component\HttpKernel\Event\ViewEvent $event
  49.      */
  50.     public function onKernelResultView(ViewEvent $event)
  51.     {
  52.         if (!$event->getRequest()->attributes->get('is_rest_request')) {
  53.             return;
  54.         }
  55.         $event->setResponse(
  56.             $this->viewDispatcher->dispatch(
  57.                 $event->getRequest(),
  58.                 $event->getControllerResult()
  59.             )
  60.         );
  61.         $event->stopPropagation();
  62.     }
  63.     /**
  64.      * @param \Symfony\Component\HttpKernel\Event\ExceptionEvent $event
  65.      *
  66.      * @throws \Exception
  67.      */
  68.     public function onKernelExceptionView(ExceptionEvent $event)
  69.     {
  70.         if (!$event->getRequest()->attributes->get('is_rest_request')) {
  71.             return;
  72.         }
  73.         $exception $event->getThrowable();
  74.         $this->logException($exception);
  75.         $event->setResponse(
  76.             $this->viewDispatcher->dispatch(
  77.                 $event->getRequest(),
  78.                 $exception
  79.             )
  80.         );
  81.     }
  82.     private function logException(Throwable $exception): void
  83.     {
  84.         if (!isset($this->logger)) {
  85.             return;
  86.         }
  87.         $logLevel LogLevel::ERROR;
  88.         if (!$exception instanceof HttpExceptionInterface || $exception->getStatusCode() >= 500) {
  89.             $logLevel LogLevel::CRITICAL;
  90.         }
  91.         $this->logger->log($logLevel$exception->getMessage(), [
  92.             'exception' => $exception,
  93.         ]);
  94.     }
  95. }
  96. class_alias(ResponseListener::class, 'EzSystems\EzPlatformRestBundle\EventListener\ResponseListener');