src/EventSubscriber/ResponseSubscriber.php line 43

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  6. use Symfony\Component\HttpKernel\KernelEvents;
  7. use Symfony\Component\Routing\RouterInterface;
  8. class ResponseSubscriber implements EventSubscriberInterface
  9. {
  10.     private $router;
  11.     private $allowOrigin;
  12.     /**
  13.      * ResponseSubscriber constructor.
  14.      *
  15.      * @param string $allowOrigin
  16.      * @param RouterInterface $router
  17.      */
  18.     public function __construct(string $allowOriginRouterInterface $router)
  19.     {
  20.         $this->router $router;
  21.         $this->allowOrigin $allowOrigin;
  22.     }
  23.     /**
  24.      * @return array
  25.      */
  26.     public static function getSubscribedEvents(): array
  27.     {
  28.         return [
  29.             KernelEvents::RESPONSE => [
  30.                 [ 'onKernelResponsePre' ]
  31.             ]
  32.         ];
  33.     }
  34.     /**
  35.      * @param ResponseEvent $event
  36.      */
  37.     public function onKernelResponsePre(ResponseEvent $event)
  38.     {
  39.         $routeName $event->getRequest()->attributes->get('_route');
  40.         if ( $event->isMainRequest() === false || $routeName === null ) {
  41.             return ;
  42.         }
  43.         // Pobieranie wszystkich zdefiniowanych metod do routingu
  44.         $methods $this->router->getRouteCollection()->get($routeName)->getMethods();
  45.         if ($event->getRequest()->getMethod() === 'OPTIONS') {
  46.             $headers $event->getResponse()->headers->all();
  47.             $headers['Access-Control-Allow-Origin'] = $this->allowOrigin;
  48.             $headers['Access-Control-Allow-Headers'] = 'Authorization, Content-Type, Content-Language, Order-Type, Order-Field, Content-Currency';
  49.             if ( count($methods) ) {
  50.                 $headers['Access-Control-Allow-Methods'] = $methods;
  51.             }
  52.             $event->setResponse(
  53.                 new Response(''204$headers)
  54.             );
  55.         } else {
  56.             $event->getResponse()->headers->add([
  57.                 'Access-Control-Allow-Origin' => $this->allowOrigin,
  58.                 'Access-Control-Expose-Headers' => 'Query-Count,Query-Page,Query-Pages,Query-Limit,Query-Range',
  59.             ]);
  60.             if ( count($methods) ) {
  61.                 $event->getResponse()->headers->add([
  62.                     'Access-Control-Allow-Methods' => $methods
  63.                 ]);
  64.             }
  65.         }
  66.     }
  67. }