Доброго времени суток, у меня есть 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'
];
}
}