Construyendo un RESTFul API con Symfony 2, Parte 2

June 18, 2021

Tags: IT Staff ES 2024
Share

Table of contents

Quick Access

symfony

 

En el post anterior, Building a RESTful API with Symfony 2, Part 1, explicamos cómo instalar y configurar los bundles necesarios para la creación de nuestro API REST con Symfony 2, detallando también la estructura de directorios de nuestra aplicación:

  • ToDoExample/
    • backend/
    • frontend/

 

En esta segunda entrega, nos enfocaremos en el backend de nuestra aplicación, explicando paso a paso cómo configurar los métodos GET, POST, PUT, y DELETE para implementar el CRUD utilizando el bundle FOSRestBundle. Posteriormente, en la tercera entrega, abordaremos el desarrollo del frontend utilizando AngularJS para consumir los recursos de nuestro API REST.

 

Puedes acceder al contenido completo de la primera parte y de este post en el siguiente enlace: GitHub - Symfony API REST Example.

 

symfony

 

Estructura de la Aplicación

Como se mencionó anteriormente, seguimos los pasos para la creación de una aplicación TO-DO que permitirá crear, editar, gestionar y eliminar tareas, con campos como título, descripción y estado. En la primera parte, creamos un nuevo bundle llamado TaskBundle. Ahora, debemos cargar dicho bundle en nuestro kernel de Symfony:

public function registerBundles() {
   $bundles = array(
       ...
       new FOS\RestBundle\FOSRestBundle(),
       new JMS\SerializerBundle\JMSSerializerBundle(),
       new Nelmio\CorsBundle\NelmioCorsBundle(),
       new Rootstack\TaskBundle\RootstackTaskBundle(),
       ...
   );
   ...
}

 

Configuración del Routing

Editaremos el archivo /app/config/routing.yml para configurar nuestro controlador REST y agregarle un prefijo a la ruta. Debemos sustituir este código:

rootstack_task:
   resource: "@RootstackTaskBundle/Controller/"
   type: annotation
   prefix: /

 

Por este:

rootstack_task:
   type: rest
   resource: "@RootstackTaskBundle/Controller/TaskController.php"
   prefix: /api

 

De esta manera, accederemos a nuestros recursos utilizando la URL base: http://localhost/ToDoExample/backend/app_dev.php/api/{ruta_para_cada_recurso}.

 

Configuración de la Base de Datos

Antes de comenzar a escribir el código, configuramos la base de datos:

  1. Edita el archivo parameters.yml ubicado en ToDoExample/backend/app/config/:
parameters:
   database_host: localhost
   database_port: null
   database_name: rest_symfony
   database_user: [your_database]
   database_password: [your_password]

 

2. Ejecuta el siguiente comando para crear la base de datos:

$ php app/console doctrine:database:create
    

 

Generando la Entidad Task

Definimos los campos necesarios en nuestra entidad Task (título, descripción y estado). Así quedará nuestra entidad:

<?php
// Código de la entidad Task con métodos para obtener y establecer cada campo
?>

 

Después de definir la entidad, ejecuta el siguiente comando para crear el schema en la base de datos:

$ php app/console doctrine:schema:update --force
    
 

Creando un FormType para Capturar y Procesar Datos

Antes de crear el controlador, crearemos un FormType para capturar parámetros y gestionar la entidad Task:

<?php
        // Código del formulario TaskType
        ?>
        
 

Creando el Controlador

El siguiente paso es crear el controlador con los métodos necesarios para cada operación (GET, POST, PUT, DELETE):

<?php
        // Código del controlador con métodos para gestionar tareas
        ?>
        

 

Anotaciones de FOSRestBundle y ParamConverter

En el controlador, utilizamos anotaciones de FOSRestBundle para definir los métodos como recursos del API REST. Estas anotaciones permiten restringir el acceso según el método HTTP:

  • @Get("/ruta_de_acceso") - Para obtener registros.
  • @Post("/ruta_de_acceso") - Para crear registros.
  • @Put("/ruta_de_acceso") - Para editar registros.
  • @Delete("/ruta_de_acceso") - Para eliminar registros.

 

También utilizamos anotaciones de la clase ParamConverter de Symfony para convertir parámetros en objetos. Ejemplo:

/**
        * Get a task by ID
        * @param Task $task
        * @return array
        * @ParamConverter("task", class="RootstackTaskBundle:Task")
        */
        public function getTaskAction(Task $task) {
           return array('task' => $task);
        }
        

Probando el API REST

Ya configurado el backend, podemos probar el API REST con herramientas como:

  1. Postman: Cliente HTTP que permite enviar peticiones para cada método con parámetros en JSON. Descargar Postman.
  2. httpie: Cliente HTTP por comandos (CLI). Más información sobre httpie.
  3. REST Client de PhpStorm: Plugin para probar el API REST directamente desde el IDE.

 

URLs y métodos de prueba:

  • GET http://localhost/ToDoExample/backend/app_dev.php/api/tasks - Obtiene todas las tareas.
  • GET http://localhost/ToDoExample/backend/app_dev.php/api/task/{id} - Obtiene una tarea por ID.
  • POST http://localhost/ToDoExample/backend/app_dev.php/api/task - Crea una nueva tarea.
  • PUT http://localhost/ToDoExample/backend/app_dev.php/api/task/{id} - Edita una tarea.
  • DELETE http://localhost/ToDoExample/backend/app_dev.php/api/task/{id} - Elimina una tarea.

Para los métodos POST y PUT, los parámetros title, description, e isDone se envían en el cuerpo de la petición.

 

Te recomendamos este video