<?php
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\RouterInterface;
class ResponseSubscriber implements EventSubscriberInterface
{
private $router;
private $allowOrigin;
/**
* ResponseSubscriber constructor.
*
* @param string $allowOrigin
* @param RouterInterface $router
*/
public function __construct(string $allowOrigin, RouterInterface $router)
{
$this->router = $router;
$this->allowOrigin = $allowOrigin;
}
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return [
KernelEvents::RESPONSE => [
[ 'onKernelResponsePre' ]
]
];
}
/**
* @param ResponseEvent $event
*/
public function onKernelResponsePre(ResponseEvent $event)
{
$routeName = $event->getRequest()->attributes->get('_route');
if ( $event->isMainRequest() === false || $routeName === null ) {
return ;
}
// Pobieranie wszystkich zdefiniowanych metod do routingu
$methods = $this->router->getRouteCollection()->get($routeName)->getMethods();
if ($event->getRequest()->getMethod() === 'OPTIONS') {
$headers = $event->getResponse()->headers->all();
$headers['Access-Control-Allow-Origin'] = $this->allowOrigin;
$headers['Access-Control-Allow-Headers'] = 'Authorization, Content-Type, Content-Language, Order-Type, Order-Field, Content-Currency';
if ( count($methods) ) {
$headers['Access-Control-Allow-Methods'] = $methods;
}
$event->setResponse(
new Response('', 204, $headers)
);
} else {
$event->getResponse()->headers->add([
'Access-Control-Allow-Origin' => $this->allowOrigin,
'Access-Control-Expose-Headers' => 'Query-Count,Query-Page,Query-Pages,Query-Limit,Query-Range',
]);
if ( count($methods) ) {
$event->getResponse()->headers->add([
'Access-Control-Allow-Methods' => $methods
]);
}
}
}
}