PHP Coach logo
Reserva ya!

Requisitos

Para que puedas realizar este curso, sería importante que tuvieras en cuenta algunos puntos. Todos ellos son imprescindibles, dado que compartirás el curso con más personas, y desde el primer segundo nos podremos manos a la obra.

No importa el sistema operativo que lleves en tu ordenador, pero asegúrate que sabes como instalar, utilizar y gestionar las herramientas que aquí se detallan.

We have available some translations for this content - English version

Atención. Este curso es bonificable mediante Fundae, anteriormente llamada Tripartita. Ponte en contacto con nosotros para más información.

  Estructura

Parece simple y trivial, pero la mayoría de las veces, es uno de los puntos más complejos a la hora de empezar un proyecto. En este primer bloque del curso, empezaremos por construir lo que será el esqueleto de nuestra aplicación. ¿Qué necesitamos para empezar desde cero un proyecto donde, nuestra lógica de negocio, será implementada alrededor de una arquitectura CQRS, y donde, es posible que en un futuro, pase a ser código non-blocking y asíncrono? ¿Cuales son las librerías que realmente vamos a necesitar para empezar con un repositorio lo más ligero posible?

En este capítulo exploraremos la base del proyecto, no tan solo en la parte teórica, sino también en la parte práctica.

  • Duración del bloque - 3h
  • Definición de capas
  • Instalamos Symfony4. El framework funcionará, solamente, como un punto de entrada
  • Command Bus como el elemento core del proyecto
  • Commands, command handlers y middlewares
  • Nuestro primer Hello world utilizando CQRS
  • Soporte en servidor por parte de Nginx + PHP-FPM
  • Un poco de benchmarking con AB

  Básicos de Docker

Hoy en dia, una de las mejores formas de hacer que cualquier aplicación pueda funciona en cualquier entorno moderno es añadiendo soporte para Docker. Docker es una tecnología bastante asequible si entiendes su función, y este será nuestro objetivo. Una vez tengamos nuestra propia estructura para nuestra aplicación de hello world, vamos a configurar docker y docker-composer para poder hacer deployments, testing y desarrollo en local.

El objetivo de este bloque es añadir soporte de docker en nuestra aplicación. Añadiremos también integración con CircleCI para añadir un hook en nuestras pull requests

  • Duración del bloque - 3h
  • Elementos necesarios de Docker
  • Docker composer para testing
  • Crear un Dockerfile base
  • Nuestro primer maravilloso test `assertTrue(true)`

  Servidor en ReactPHP

¿Cuan rápido puede responder tu servicio? Son los servidores tradicionales como Nginx o Apache la forma más óptima de deployar tus servicios en PHP, o podemos encontrar fórmulas un poco más eficientes que hagan que la performance de estos sean aún mucho mejor?

Este puede que sea una de las preguntas más formuladas entre los desarrolladores web desde el principio de los tiempos. Y aquí tenemos mucho tema del que hablar, básicamente porque parece que las cosas pueden ir más rápidas... MUCHO más rápidas utilizando otras tecnologías como PHP-PM o utilizando un poco más al detalle nuestro gran amigo ReactPHP.

El objetivo de este capítulo será hacer un pequeño viaje por todos los servidores PHP, desde el ya conocido y estable en producción Nginx con PHP-FPM, hasta el nuevo monothread y blocking ReactPHP server.

  • Duración del bloque - 2h
  • Primer análisis a PHP-PM
  • Primer análisis al servidor de ReactPHP
  • Benchmarking & discusión

  Definición del Dominio

Ahora ya tenemos un servicio que sirve peticiones tan rápido como realmente puede hacerlo, pero solo podemos servir un solo endpoint. Y será complicado ganar un poco de dinero tan solo con esta funcionalidad, por lo que vamos a empezar a diseñar nuestro dominio.

Y nuestro proyecto será simple. Crearemos un pequeño servicio para gestionar usuarios. No será un sistema de login ni un sistema de gestión demasiado complejo, solo una pequeña API donde podremos:

  • Añadir un usuario
  • Eliminar un usuario existente
  • Editar un usuario existente
  • Listar todos nuestros usuarios

Estos puntos serán suficientes como para entender ciertos puntos sobre la arquitectura, como donde añadir nuestras clases de dominio, qué deberían contener estas clases y que deberían evitar, y cuan grande puede ser dicho dominio antes de poder aplicar una separación lógica.

Después de este capítulo, todo debería estar funcionando perfectamente de una forma completamente síncrona, y guardando absolutamente todo en memoria. Aún no siendo útil de ninguna de las formas, oye, es un primer paso.

  • Duración del bloque - 3h
  • Análisis de requerimientos
  • Implementación de las clases del modelo
  • Interfaces de repositorios y implementación en memoria
  • Tests completos de nuestras necesidades, tanto unitarios como funcionales

  Dependencias de I/O

Vamos a hacer que todo funcione correctamente añadiendo una capa extra en nuestro proyecto, relativa a nuestras implementaciones de I/O. En nuestro lenguaje, añadir adaptadores para nuestros repositorios, como el de Repositorio de User.

Todos estos adaptadores tienen que estar cubiertos por tests unitarios al 100%, Veremos cómo, a pesar de todo, si seguimos la arquitectura que vamos a seguir, este ejercicio será trivial y rápido.

Después de este bloque, nuestra aplicación pasará a ser usable.

  • Duración del bloque - 3h
  • Adaptador Mysql para la capa de persistencia
  • Tests unitarios para los nuevos adaptadores

  Cambiando a Asíncrono

Este es el último paso, aunque no el menos importante. ¿Cómo podemos mejorar el servicio, haciendo que nuestras escrituras sean asíncronas? ¿Podemos posponer algunas acciones como añadir un nuevo usuario, y persistir dichas acciones cuando el servidor no esté tan ocupado?

Cuando creas un nuevo microservicio, una de las opciones que siempre deberías valorar es que, eventualmente, puedes tener una carga muy alta de requests. Las lecturas, claro, tienen que ser síncronas, pero qué pasa con las escrituras? Podemos añadir algunas colas y consumir los mensajes en paralelo, haciendo parte del trabajo del servidor? Esto haría nuestro servicio un poco más rápido, verdad?

Utilizaremos RabbitMQ para dicha cuestión, añadiendo algunas clases en nuestra arquitectura CQRS que harán las maravillas de los más incrédulos.

Después de este capítulo, tendremos una aplicación hecha en Symfony4 utilizando un servidor ReactPHP, CQRS como nuestro patrón de arquitectura base y algunos conceptos del que se conoce como SOLID. Pequeñas clases, pequeñas funcionalidades y un repositorio con el que trabajarás estupendamente. Este es el trato.

  • Duración del bloque - 3h
  • Añadiendo un middleware de asíncronía para nuestras escrituras
  • Adaptador para RabbitMQ
  • Completar Docker para que pueda trabajar con colas