symfony Разрешить HTTP OPTIONS для набора (или всех) методов (без бандла). Обработка события получения запроса kernel.request
Primary tabs
Проверено в 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
Источники:
- Log in to post comments
- 1956 reads