Desde Symfony 6.3 tenemos disponible en Symfony atributo que nos permite mapear automaticamente la petición a un objeto tipado y validar los campos de este, utilizando una cantidad mínima de código. Tenemos la anotación MapRequestPayload para mapear peticiones POST y MapQueryString para mapear peticiones GET.
Veámoslo con un ejemplo, supongamos que vamos a recibir una petición POST con una pagina y una cantidad de resultados.
Primero el DTO. Podemos ver que la validación se hace con Constraints de Symfony.
use Symfony\Component\Validator\Constraints as Assert;
class PaginationDto
{
public function __construct(
#[Assert\GreaterThanOrEqual(1)]
public readonly string $pagina,
#[Assert\GreaterThanOrEqual(10)]
#[Assert\LessThanOrEqual(100)]
public readonly int $resultados,
) {
}
}
Y el controlador
use Symfony\Component\HttpKernel\Attribute\MapRequestPayload;
class HomeController
{
public function home(
#[MapRequestPayload] PaginationDto $paginationDto,
): Response {
...
}
}
Y ya tendrías la petición mapeada a un objeto.
Si hay algún error con la petición la aplicación va a devolver los siguientes códigos de error: 422 para errores de validación, 400 para peticiones erróneas y 415 para datos que no se han podidio deserailizar.