
Construyendo un RESTFul API con Symfony 2, Parte 2
Tabla de contenido

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.

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:
- 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:
- Postman: Cliente HTTP que permite enviar peticiones para cada método con parámetros en JSON. Descargar Postman.
- httpie: Cliente HTTP por comandos (CLI). Más información sobre httpie.
- 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.