symfony Разрешить HTTP OPTIONS для набора (или всех) методов (без бандла). Обработка события получения запроса kernel.request

Проверено в Symfony 4.3:

Предлагаемое решение состоит в том, чтобы поставить подобный обработчик события, в дикторию:

# src/EventListener/RequestListener.php
namespace App\EventListener;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use App\Security\CorsSettings;
use Symfony\Component\HttpFoundation\JsonResponse;

class RequestListener
{
    public function onKernelRequest(GetResponseEvent $event)
    {
        if ($event->getRequest()->getMethod() === 'OPTIONS') {
            $headers = CorsSettings::getHeadres();
            $response = new JsonResponse([
                'method' => $event->getRequest()->getMethod(),
                ], 200, $headers);
            $event->setResponse($response);
        }

    }
}

где:

  • CorsSettings::getHeadres() -- вернет массив нужных заголовков (у вас может быть другая реализация)
  • $event->getRequest() -- получив запросы вы можете также узнать и маршрут (если требуется разрешить что-то только для отдельных маршрутов)

далее в:

config/services.yaml

добавим:

app.options_listener:
	class: App\EventListener\RequestListener
	tags:
		- { name: kernel.event_listener, event: kernel.request, priority: 33 }

Чтобы узнать нужный приоритет, можно использовать команду:

bin/console debug:event-dispatcher kernel.request

Без конфигурации в services.yaml

Аналогичный функционал можно получить и без правки config/services.yaml, если
в стандартную автозагружаемую директорию:

src/EventSubscriber

добавить класс:

// src/EventSubscriber/TokenSubscriber.php
namespace App\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Security\CorsSettings;


class TokenSubscriber implements EventSubscriberInterface
{
    public function onKernelRequest(RequestEvent $event)
    {
        $request = $event->getRequest();
  
        if ($request->getMethod() == 'OPTIONS') {
            $event->setResponse( // изменяем ответ
                new JsonResponse('', 200, CorsSettings::getHeadres())
            );
        }
    }

    public static function getSubscribedEvents()
    {
        return [
            KernelEvents::REQUEST  => ['onKernelRequest', 2049],
        ];
    }
}

Спасибо за решение: @math2

Источники:

  1. https://symfony.com/doc/current/event_di...
  2. https://symfony.com/doc/current/referenc...