Code Monkey home page Code Monkey logo

php_api_rest's Introduction

img Usuarios y Resultados REST API

MIT license Minimum PHP Version PHPUnit Tests

Logros de la práctica

Se ha implementado el modelo de resultado con el ORM Doctrine y la aplicación web con swagger y el potentísimo framework de Symfony con todas las operaciones demandadas en la práctica.

img

Con dos operaciones añadidas:

  • GET /results/bigger : solicita un valor y devuelve la lista de resultados que tienen un valor mayor.
  • GET /results/number : devuelve el numero de resultados registrados.

Cada Resultado almacena el usuario que lo registró, junto a su fecha y valor.

Se han implementado las pruebas adaptadas a la entidad Result y a las funcionalidades de la API que trabajan con ellos, a continuacción se presentan las imagenes del resultado de la ejecucion de las pruebas con:

php bin/phpunit --testdox

img img img

He de comentar que no he conseguido controlar el flujo de ejecución de algunos tests, por lo que hay dos test, dependientes de la creación y borrado de resultados, que a veces funcionan y otras no.

El resultado de cubrimiento de código se puede ver en /var/coverage.

🎯 Implementación de una API REST con el framework Symfony para la gestión de usuarios y resultados.

Esta aplicación implementa una interfaz de programación REST desarrollada como ejemplo de utilización del framework Symfony. La aplicación proporciona las operaciones habituales para la gestión de entidades (usuarios y resultados). Este proyecto utiliza varios componentes del framework Symfony, JWT (JSON Web Tokens), el logger Monolog y el ORM Doctrine.

Para hacer más sencilla la gestión de los datos se ha utilizado el ORM Doctrine. Doctrine 2 es un Object-Relational Mapper que proporciona persistencia transparente para objetos PHP. Utiliza el patrón Data Mapper con el objetivo de obtener un desacoplamiento completo entre la lógica de negocio y la persistencia de los datos en los sistemas de gestión de bases de datos.

Por otra parte se incluye parcialmente la especificación de la API (OpenAPI 3.0) . Esta especificación se ha elaborado empleando el editor Swagger. Adicionalmente se incluye la interfaz de usuario (SwaggerUI) de esta fenomenal herramienta que permite realizar pruebas interactivas de manera completa y elegante.

🚀 Instalación de la aplicación

El primer paso consiste en generar un esquema de base de datos vacío y un usuario/contraseña
con privilegios completos sobre dicho esquema.

A continuación se deberá crear una copia del fichero ./.env y renombrarla como ./.env.local. Después se debe editar dicho fichero y modificar la variable DATABASE_URL con los siguientes parámetros:

  • Nombre y contraseña del usuario generado anteriormente
  • Nombre del esquema de bases de datos

Una vez editado el anterior fichero y desde el directorio raíz del proyecto se deben ejecutar los comandos:

$ composer update
$ php bin/console doctrine:schema:update --dump-sql --force

El proyecto base entregado incluye el componente lexik/jwt-authentication-bundle para la generación de los tókens JWT. Siguiendo las instrucciones indicadas en la documentación de dicho componente se deberán generar las claves SSH necesarias con los comandos:

$ mkdir -p config/secrets/jwt
$ openssl genpkey -out config/secrets/jwt/private.pem -aes256 -algorithm rsa -pkeyopt rsa_keygen_bits:4096
$ openssl pkey -in config/secrets/jwt/private.pem -out config/secrets/jwt/public.pem -pubout

En la instalación de XAMPP el programa openssl se encuentra en el directorio XAMPP/apache/bin. El resto de la configuración ya se ha realizado en este proyecto. Como pass phrase se empleará la especificada en la variable JWT_PASSPHRASE en el fichero .env.

Para lanzar el servidor con la aplicación en desarrollo, desde la raíz del proyecto se debe ejecutar el comando:

$ symfony serve [-d]

Antes de probar la interfaz de la API es recomendable crear al menos un usuario con permisos de administrador. Para conseguir este objetivo se ha proporcionado un comando disponible a través de la consola de Symfony. La descripción del funcionamiento de este comando puede obtenerse con:

$ php bin/console miw:create-user --help

A continuación ya se puede realizar una petición con el navegador a la dirección https://127.0.0.1:8000/

🗄️ Estructura del proyecto:

El contenido y estructura del proyecto es:

  • Directorio raíz del proyecto .:
    • .env: variables de entorno locales por defecto
    • phpunit.xml.dist configuración por defecto de la suite de pruebas
    • README.md: este fichero
  • Directorio bin:
    • Ejecutables (console y phpunit)
  • Directorio src:
    • Contiene el código fuente de la aplicación
    • Subdirectorio src/Entity: entidades PHP (incluyen anotaciones de mapeo del ORM)
  • Directorio var:
    • Ficheros de log y caché (diferenciando entornos).
  • Directorio public:
    • index.php es el controlador frontal de la aplicación. Inicializa y lanza el núcleo de la aplicación.
    • Subdirectorio api-docs: cliente Swagger y especificación de la API.
  • Directorio vendor:
    • Componentes desarrollados por terceros (Symfony, Doctrine, JWT, Monolog, Dotenv, etc.)
  • Directorio tests:
    • Conjunto de scripts para la ejecución de test con PHPUnit.

🛠️ Ejecución de pruebas

La aplicación incorpora un conjunto de herramientas para la ejecución de pruebas unitarias y de integración con PHPUnit. Empleando este conjunto de herramientas es posible comprobar de manera automática el correcto funcionamiento de la API completa sin la necesidad de herramientas adicionales.

Para configurar el entorno de pruebas se debe crear un nuevo esquema de bases de datos vacío, y una copia del fichero ./phpunit.xml.dist y renombrarla como ./phpunit.xml. De igual forma se deberá crear una copia del fichero ./.env.test y renombrarla como ./.env.test.local. Después se debe editar este último fichero para asignar los siguientes parámetros:

  • Configuración del acceso a la nueva base de datos (variable DATABASE_URL)
  • E-mail y contraseña de los usuarios que se van a emplear para realizar las pruebas (no es necesario insertarlos, lo hace automáticamente el método setUpBeforeClass() de la clase BaseTestCase)

Para lanzar la suite de pruebas completa se debe ejecutar:

$ ./bin/phpunit [--testdox] [--coverage-text]

Adicionalmente, para comprobar la calidad de las pruebas, el proyecto incluye test de mutaciones generados con la herramienta Infection. El funcionamiento es simple: se generan pequeños cambios en el código original (mutantes), y a continuación se ejecuta la batería de pruebas. Si las pruebas fallan, indica que han sido capaces de detectar la modificación del código, y el mutante es eliminado. Si pasa las pruebas, el mutante sobrevive y la fiabilidad de la prueba queda cuestionada.

Para lanzar los test de mutaciones se ejecutará:

> composer infection

Por último, también se han añadido dos herramientas para el análisis estático de código, PHPStan y PhpMetrics. PhpStan es una herramienta de análisis estático de código, mientras que PhpMetrics analiza el código y permite generar informes con diferentes métricas de proyecto. Estas herramientas pueden ejecutarse a través de los comandos:

> composer phpstan
> composer metrics

php_api_rest's People

Contributors

alvarorgz avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.