
Symfony: Mapear peticiones a un DTO (Data to Typed Object)
Continuando con el articulo sobre los Parámetros de la petición Symfony veremos como como mapear automáticamente la petición a un objeto tipado y validar los campos de este usando el atributo MapRequestPayload.
Para realizar esta guia tomamos en cuenta que se tiene instalado composer y el binario de symfony.
Primeramente crearemos nuestro proyecto, instalamos las dependencias necesarias y ejecutamos usando el binario de symfony:
Para realizar esta guia tomamos en cuenta que se tiene instalado composer y el binario de symfony.
Primeramente crearemos nuestro proyecto, instalamos las dependencias necesarias y ejecutamos usando el binario de symfony:
symfony new-proyect cd new-proyect #Dependencia para la serialización de objetos composer require symfony/serializer-pack #Dependencia para la validacion composer require symfony/validator #Iniciamos proyecto symfony symfony server:start
Una vez iniciado el proyecto procedemos a crear el Controlador y el Objeto (DTO) que recibiremos en la petición. En este casos crearemos un objeto inicial, para un paginado el cual tendremos un número de página (page), la cantidad de elementos por página y una query para realizar búsquedas.
<?php namespace App\DTO; use Symfony\Component\Validator\Constraints as Assert; class PaginationDto { public function __construct( #[Assert\GreaterThanOrEqual(1)] public readonly int $page, #[Assert\GreaterThanOrEqual(10)] #[Assert\LessThanOrEqual(100)] public readonly int $results, public readonly string $query = '' ) { } }
En el controlador retornaremos el objeto, como json, en próximas guías estaremos realizando un api, paginando y obteniendo datos de la base de datos.
<?php namespace App\Controller; use App\DTO\PaginationDto; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpKernel\Attribute\MapRequestPayload; use Symfony\Component\Routing\Annotation\Route; class App extends AbstractController { #[Route('/pages', name: 'pages', methods: ['POST'])] public function pages(#[MapRequestPayload] PaginationDto $paginationDto): JsonResponse { return new JsonResponse($paginationDto); } }
Ahora si realizamos una petición la siguiente petición:
curl --request POST \ --url http://127.0.0.1:8000/pages \ --header 'Accept: application/json' \ --header 'content-type: application/json' \ --data '{ "page": "1", "results": "10", "query": "search" }'
Obtenedremos un objeto json con 2 errores donde nos dice que tenemos que enviar page y results como, enteros. Si cambiamos y enviamos como entero:
curl --request POST \ --url http://127.0.0.1:8000/pages \ --header 'Accept: application/json' \ --header 'content-type: application/json' \ --data '{ "page": 1, "results": 10, "query": "search" }'
Obtendremos el objeto json, como resultado de proceso de conversión de la data que enviamos y procesada como objeto.
{ "page": 1, "results": 10, "query": "search" }
Para las peticiones pueden usar curl, desde la terminal o alguna aplicación grafica, en mi caso uso Hoppscotch el cual es libre y lo pueden encontrar acá en su pagina de proyecto: hoppscotch/hoppscotch: Open source API development ecosystem - https://hoppscotch.io (open-source alternative to Postman, Insomnia)
Nos vemos próximamente, realizaremos un crud completo en symfony usando mysql (API solamente, luego integraremos a angular).
Deja un comentario: