src/EventListener/KernelEventListener.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Utils\ParameterBagUtil;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  8. use Symfony\Component\HttpKernel\Event\KernelEvent;
  9. use Symfony\Component\HttpKernel\Event\RequestEvent;
  10. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  11. use Symfony\Component\HttpKernel\KernelEvents;
  12. class KernelEventListener implements EventSubscriberInterface
  13. {
  14.     public function __construct(
  15.         private ParameterBagUtil $parameterBagUtil
  16.     ) {
  17.     }
  18.     public static function getSubscribedEvents(): array
  19.     {
  20.         return [
  21.             KernelEvents::REQUEST => ['onKernelRequest'9999],
  22.             KernelEvents::RESPONSE => ['onKernelResponse'9999],
  23.             KernelEvents::EXCEPTION => ['onKernelException'9999]
  24.         ];
  25.     }
  26.     public function onKernelException(ExceptionEvent $event): void
  27.     {
  28.         $this->addCorsHeaders($event);
  29.     }
  30.     public function addCorsHeaders(KernelEvent $event): void
  31.     {
  32.         $response $event->getResponse();
  33.         if ($response) {
  34.             $allowOrigin $this->getAllowOrigin($event->getRequest());
  35.             if ($allowOrigin) {
  36.                 $response->headers->set('Access-Control-Allow-Origin'$allowOrigin);
  37.                 $response->headers->set('Access-Control-Allow-Methods''GET,POST,PUT,PATCH');
  38.                 $response->headers->set('Access-Control-Allow-Headers''Origin, content-type, accept');
  39.                 $response->headers->set('Access-Control-Allow-Credentials''true');
  40.             }
  41.         }
  42.     }
  43.     private function getAllowOrigin(Request $request): ?string
  44.     {
  45.         if(!$request->headers->has('Origin')) return null;
  46.         if(preg_match(ParameterBagUtil::$bag->get('cors.origin'), $request->headers->get('Origin'))) {
  47.             return $request->headers->get('Origin');
  48.         }
  49.         return null;
  50.     }
  51.     public function onKernelRequest(RequestEvent $event): void
  52.     {
  53.         // Don't do anything if it's not the master request.
  54.         if (!$event->isMainRequest()) {
  55.             return;
  56.         }
  57.         $request $event->getRequest();
  58.         $method $request->getRealMethod();
  59.         if (Request::METHOD_OPTIONS === $method) {
  60.             $response = new Response();
  61.             $event->setResponse($response);
  62.         }
  63.     }
  64.     public function onKernelResponse(ResponseEvent $event): void
  65.     {
  66.         // Don't do anything if it's not the master request.
  67.         if (!$event->isMainRequest()) {
  68.             return;
  69.         }
  70.         $this->addCorsHeaders($event);
  71.     }
  72. }