@thisall

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

Доброго времени суток, у меня есть controller `FeedbackController` с функцией `sendFeedback` и она принимает 1 аргумент `FeedbackRequest`, для заполнения `FeedbackRequest` я использую `FeedbackRequestArgumentValueResolver`, который заполняет DTO нужными данными, но у меня нет валидации данных и я решил её сделать через `RequestSubscriber`, но у меня проблема в том, что я не понимаю как правильно дать понять Subscriber'у, о том какую DTO нужно валидировать. Подскажите пожалуйста как такое можно реализовать ?

FeedbackController
class FeedbackController extends AbstractController
{
    /** @var FeedbackSenderInterface */
    private $feedbackSender;

    public function __construct(FeedbackSenderInterface $feedbackSender)
    {
        $this->feedbackSender = $feedbackSender;
    }

    /**
     * @Route("/api/feedback", name="send_feedback", methods={"POST"})
     *
     * @param FeedbackRequest $request
     * @return JsonResponse
     */
    public function sendFeedback(FeedbackRequest $request): JsonResponse
    {
        return new JsonResponse([
            'status' => 'successfully'
        ]);
    }
}


FeedbackRequest
class FeedbackRequest
{
    /**
     * @Assert\NotBlank()
     */
    private $feedback;

    public function __construct(string $feedback)
    {
        $this->feedback = $feedback;
    }

    public function getFeedback(): string
    {
        return $this->feedback;
    }
}


FeedbackRequestArgumentValueResolver
class FeedbackRequestArgumentValueResolver implements ArgumentValueResolverInterface
{
    public function supports(Request $request, ArgumentMetadata $argument): bool
    {
        return FeedbackRequest::class === $argument->getType();
    }

    public function resolve(Request $request, ArgumentMetadata $argument): iterable
    {
        yield new FeedbackRequest($request->get('feedback'));
    }
}


RequestSubscriber
class RequestSubscriber implements EventSubscriberInterface
{
    /** @var ValidatorInterface */
    private $validator;

    public function __construct(ValidatorInterface $validator)
    {
        $this->validator = $validator;
    }

    public function onKernelRequest(RequestEvent $event)
    {
        //TODO ADD VALIDATION
    }

    public static function getSubscribedEvents(): array
    {
        return [
            RequestEvent::class => 'onKernelRequest'
        ];
    }
}
  • Вопрос задан
  • 31 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы