Mapear peticiones a un DTO (Data to Typed Object) en Symfony

Túneles SSH
Solucionex
31
Oct 24

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. 

symfony