Как можно сделать общий Request Validator с помощью RequestSubscriber?

Для создания общего Request Validator'а с помощью RequestSubscriber в Symfony есть несколько шагов, которые нужно выполнить. Вот подробное описание каждого шага:

1. Создайте класс, который будет служить подписчиком событий для RequestSubscriber. Для этого класса необходимо реализовать интерфейс EventSubscriberInterface, который является частью Symfony. В этом классе вы будете определять методы, которые будут выполняться при определенных событиях.

use SymfonyComponentEventDispatcherEventSubscriberInterface;
use SymfonyComponentHttpKernelEventRequestEvent;
use SymfonyComponentHttpKernelKernelEvents;

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

    public function onKernelRequest(RequestEvent $event)
    {
        // Ваш код для валидации запроса здесь
    }
}

2. В конфигурационном файле services.yaml добавьте определение сервиса для созданного класса:

services:
    AppEventListenerRequestValidator:
      tags:
          - { name: kernel.event_subscriber }

3. Теперь вы можете добавить код в метод onKernelRequest для валидации запроса. В качестве примера, предположим, что вы хотите проверить, находится ли заголовок запроса в правильном формате.

namespace AppEventListener;

use SymfonyComponentEventDispatcherEventSubscriberInterface;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHttpKernelEventRequestEvent;
use SymfonyComponentHttpKernelKernelEvents;

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

    public function onKernelRequest(RequestEvent $event)
    {
        $request = $event->getRequest();
        $headerValue = $request->headers->get('X-Header');
        
        if (!preg_match('/^[w-]+$/', $headerValue)) {
            $response = new Response('Invalid header', Response::HTTP_BAD_REQUEST);
            $event->setResponse($response);
        }
    }
}

4. После этого RequestValidator будет автоматически вызываться при каждом запросе. В примере выше, если заголовок X-Header не соответствует правильному формату, будет возвращен ответ с кодом 400 (Bad Request).

Теперь у вас есть общий Request Validator, который будет проверять запросы на предмет соответствия определенным условиям. Как вам нравится, вы можете дополнить его другими проверками или внести изменения в соответствии с вашими требованиями.