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:
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.
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(),
...
);
...
}
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}
.
Antes de comenzar a escribir el código, configuramos la base de datos:
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
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
Antes de crear el controlador, crearemos un FormType para capturar parámetros y gestionar la entidad Task:
<?php
// Código del formulario TaskType
?>
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
?>
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:
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);
}
Ya configurado el backend, podemos probar el API REST con herramientas como:
URLs y métodos de prueba:
http://localhost/ToDoExample/backend/app_dev.php/api/tasks
- Obtiene todas las tareas.http://localhost/ToDoExample/backend/app_dev.php/api/task/{id}
- Obtiene una tarea por ID.http://localhost/ToDoExample/backend/app_dev.php/api/task
- Crea una nueva tarea.http://localhost/ToDoExample/backend/app_dev.php/api/task/{id}
- Edita una tarea.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.