La construcción de una API RESTful con Symfony 2, Parte 1

June 18, 2021

En esta serie de publicaciones de blogs, estaremos siguiendo los pasos para construir una sencilla app de tareas, utilizando AngularJS y Symfony 2. En estas dos primeras partes ahondaremos la construcción de una API REST con Symfony 2.

Para este tutorial vamos a suponer que usted está ejecutando un ambiente *Nix (Mac OS X, Linux), y tener al menos PHP, MySQL y Composser instalados. Ademas de tener buenos conocimientos en PHP.

Preparación de su proyecto

Como se puede imaginar, nuestra primera tarea es instalar nuestro entorno de desarrollo, y para ello vamos a instalar Symfony utilizando su programa de instalación de línea de comandos. Para ello vamos a tener que descargar el instalador para nuestra máquina, si ya tiene el programa de instalación de línea de comandos se puede omitir el siguiente paso:

$ sudo curl -LsS http://symfony.com/installer -o /usr/local/bin/symfony
$ sudo chmod a+x /usr/local/bin/symfony

Después de tener el instalador en nuestra máquina, tendrá que navegar hasta la carpeta que contiene su código API REST, para este tutorial voy a estar trabajando con dos carpetas, así que voy a tener la siguiente distribución:

  • ToDoExample/
    • backend/
    • frontend/

Así que en este caso voy a tener que navegar hasta la carpeta ToDoExample y ejecutar el siguiente comando:

$ symfony new backend

Esto creará la carpeta backend y copiara los archivos de Symfony requeridos. Tendremos una instalación básica de Symfony ya lista para desarrollar, si está ejecutando PHP5.4 +, fácilmente se podría probar nuestra instalación de Symfony mediante la ejecución en la consola:

$ cd backend
$ php app/console server:run

Si se desplaza a la url proporcionada en la salida de ese comando (http://127.0.0.1:8000), va a obtener un error 404 del framework Symfony, esto no es malo, esto significa que ya ha consultado a la salida de su instalación básica de Symfony.

Ahora tenemos que instalar los Bundles que vamos a utilizar para construir nuestra API REST: FosRestBundle, JMSSerializerBundle, NelmioCorsBundle, para llevar a cabo esta tarea, tendrá que ejecutar los siguientes comandos en la consola:

$ composer require friendsofsymfony/rest-bundle
$ composer require jms/serializer-bundle
$ composer require nelmio/cors-bundle

Una vez hecho esto, ahora tenemos que decirle a Symfony para cargar nuestros paquetes recién instalados, esto se hace mediante el registro en nuestro núcleo, ahora van a app / AppKernel.php y en la matriz de paquetes, añadir nuestros paquetes:

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

Ahora tenemos que configurar nuestros paquetes, el primer paquete tendremos que configurar es NelmioCorsBundle, en su aplicación / config.yml copiar las siguientes líneas al final:

nelmio_cors:
    defaults:
        allow_credentials: false
        allow_origin: ['*']
        allow_headers: ['X-Custom-Auth']
        allow_methods: ['POST', 'PUT', 'GET', 'DELETE']
        max_age: 3600
        hosts: []
        origin_regex: false

Ahora vamos a tener que configurar el FosRestbundle, en el mismo archivo (app / config.yml) escribir estas líneas:

fos_rest:
    param_fetcher_listener: true
    body_listener: true
    format_listener: true
    view:
        view_response_listener: 'force'
        formats:
            xml: true
            json : true
        templating_formats:
            html: true
        force_redirects:
            html: true
        failed_validation: HTTP_BAD_REQUEST
        default_engine: twig
    routing_loader:
        default_format: json

Para el JMSSerializerBundle se crearán las configuraciones cuando creamos nuestro modelo en la siguiente parte de nuestro tutorial.

El siguiente paso es crear nuestro paquete REST, vamos a utilizar una herramienta de línea de comandos en la consola de Symfony, abra el terminal y escriba:

$ php app/console generate:bundle

Y siga el asistente, puede utilizar los siguientes valores para configurar el paquete:

  • Espacio de nombre del Bundle: Rootstack/TaskBundle
  • Confirmar el nombre, presione enter.
  • Confirmar la carpeta, presione enter.
  • Vamos a utilizar las anotaciones de nuestro controlador, por lo que escribir la anotación
  • No hacemos más que confirmar las siguientes cuatro preguntas, para lo cual presiona enter en cada una.
¿Donde nos encontramos ahora?

Ahora tenemos nuestro paquete básico, pero todavía estamos muy lejos de tener una API REST funcional, ahora vamos a explicar un poco de lo que cada uno de estos paquetes que instalamos va a hacer por nosotros:

FosRestBundle

Es la base de nuestra API REST, que se encargará de los procesos repetitivos en cada REST Call, que son verificar la solicitud, y que el punto final admita el verbo correcto, llame a nuestra acción, y serializar los datos en el formato deseado, que maneja varios métodos de serialización, pero los dos principales son JSON y XML.

JMSSerializerBundle

Este es el paquete que se encarga de la serialización real de nuestros objetos, matrices y valores. Lo que se trata es de resolver el problema de tener que hablar el "lenguaje" correcto de nuestro visitante, responderemos en nuestro "lenguaje" y este paquete se traducirá en el "lenguaje" que pide al usuario.

NelmioCorsBundle:

Si ha hecho algo de ajax en la web, usted sabe que no se puede realizar una llamada desde un dominio a otro, el mismo principio se aplica para las llamadas de API REST en AngularJS, por lo que CORS son algunas cabeceras que ayudara a nuestro servidor a permitir un dominio diferente para llamar a nuestra API.

¿Que sigue?

En el siguiente tutorial vamos a crear nuestro modelo y la implementación de un CRUD con el descanso, con el fin de consumirlo con un extremo frontal AngularJS. Mientras tanto, puede seguir practicando sus habilidades de Symfony, mientras que publiquemos la parte 2 de estos blogs.