<?php namespace App\ArgumentResolver; use App\Exception\RequestBodyConvertException; use App\Exception\ValidationException; use Symfony\Component\HttpKernel\Controller\ValueResolverInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; use App\Attribute\RequestBody; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; use Symfony\Component\Serializer\Encoder\JsonEncoder; use Symfony\Component\Serializer\SerializerInterface; class RequestBodyArgumentResolver implements ValueResolverInterface { public function __construct( private SerializerInterface $serializer, private ValidatorInterface $validator, ) {} public function resolve(Request $request, ArgumentMetadata $argument): iterable { if (!$argument->getAttributesOfType(RequestBody::class, ArgumentMetadata::IS_INSTANCEOF)) { return []; } try { $model = $this->serializer->deserialize( $request->getContent(), $argument->getType(), JsonEncoder::FORMAT ); } catch (\Throwable $throwable) { throw new RequestBodyConvertException($throwable->getMessage()); } $errors = $this->validator->validate($model); if (count($errors) > 0) { throw new ValidationException($errors); } return [$model]; } }