PHP

Curso de Creación y Publicación de Packages en PHP

Crea y publica packages en Packagist para PHP, instalables vía Composer, con sus pruebas unitarias y flujos de CI
En marcha
Avanzado
54 Clases 9 h (aprox.)
79€
65€
Precio en promoción
Si te dedicas al desarrollo profesional con PHP estamos seguros que usarás Composer para la gestión de las dependencias. Si no conoces esta herramienta, deberías empezar por ahí. La verás usar en prácticamente todos los cursos de PHP impartidos en EscuelaIT, ya que es un conocimiento básico y esencial para el desarrollo moderno.

Sin embargo, aunque la mayoría usemos Composer, no todo el mundo tiene el conocimiento necesario para publicar sus packages, con código de base que usa proyecto tras proyecto. En la mayoría de los casos acabamos copiando y pegando archivos que nos viene bien reutilizar de un proyecto a otro.

Publicar packages en Packagist puede ser una excelente experiencia, no solo para facilitar el desarrollo de los proyectos con código de base que tendrás al alcance de un simple comando de consola (composer require), sino también una oportunidad de mejorar tu perfil como desarrollador, publicando software libre para que la comunidad lo pueda usar.

En este curso verás que el proceso para publicar un package no es complicado y en poco tiempo lo puedes tener listo. Lo que sí requiere un poco más de tiempo es crear un package bien diseñado, con una estructura correcta, sus pruebas del software, los sistemas de CI y todo lo que necesitas para mantener los estándares de calidad que requiere un proyecto de software libre. Todo eso lo podrás aprender en este curso de creación de paquetes en Composer.

Qué aprenderé en el Curso de Creación y Publicación de Packages en PHP

  • Desarrollar con PHP usando buenas prácticas
  • Manejar espacios de nombres (namespaces) de una manera más consciente
  • Configurar el sistema de autoload de clases y funciones de Composer
  • Realizar las pruebas del software con PHPUnit sobre los packages publicados
  • Aplicar técnicas de refactoring para mejorar el diseño de los packages
  • Entender los flujos de trabajo habituales para automatizar las pruebas y el despliegue de nuevas versiones de los proyectos CI/CD
  • GitHub Actions para automatizar los flujos de trabajo

Objetivos del curso

Desarrollar packages para publicar en Packagist, de modo que se puedan instalar en cualquier proyecto PHP mediante Composer. Desarrollar las pruebas del software de los packages y mantener un enfoque dirigido por pruebas con PHPUnit, para llegar a un diseño correcto usando técnicas de Refactoring. Correr las pruebas automáticamente con un enfoque CI usando GitHub Actions y gestionar las versiones para publicar los packages en Packagist con cada nueva actualización.

Por qué debes aprender creación y publicación de Packages en PHP

Este es un curso que abordará numerosas áreas esenciales del desarrollo moderno, como el diseño del software, las pruebas del software, GitHub Actions para poder aplicar enfoques de CI, manejo de Git y GitHub para Pull Request, correr pruebas automáticamente y realizar otras automatizaciones con GitHub Actions, etc. Todo bajo el objetivo de publicar packages en Packagist que sean instalables en cualquier proyecto vía Composer, fáciles de mantener y con estándares de calidad elevados.

Por tanto, es útil para cualquier persona que quiera mejorar sus conocimientos de desarrollo con PHP y las herramientas habituales en el mundo del desarrollo moderno de proyectos de software.

Además, publicar packages en Packagist te dará la oportunidad de mejorar tus flujos de trabajo, pudiendo mantener de una manera centralizada las piezas de software que usas repetidas veces a lo largo de los distintos proyectos que vas realizando. Además, puede ser una buena oportunidad para mejorar tu perfil de desarrollador, mostrando al mundo lo que eres capaz de hacer en el área del software libre con PHP.

Qué tengo que saber

Es necesario sobre todo tener un conocimiento sólido sobre el lenguaje PHP.

Además en este curso veremos pruebas con PHPUnit y haremos uso del sistema de control de versiones Git y el servicio de GitHub, por lo que sería ideal tener también algunos conocimientos sobre estas herramientas.

Clases y contenidos

Objetivos del Curso de Creación y Publicación de Packages en PHP Gratis

En este vídeo hacemos un resumen de los contenidos y objetivos que vamos a abordar durante el curso, en las distintas disciplinas que abarcamos, desde el desarrollo con PHP, las pruebas, el diseño del software y las operaciones DevOps.

Creación de package para Composer desde cero

Comenzamos nuestro primer proyecto del curso, un package para crear contraseñas de manera aleatoria basadas en una configuración definida por el desarrollador. Veremos los pasos necesarios para crear el package, las pruebas y configurar el composer.json.

Composer init Gratis

Cómo inicializar la creación de un proyecto que pretendemos publicar en Packagist, con el comando composer init. Explicamos cómo realizar la configuración inicial del proyecto.

Clase password generator

Creamos la clase en cuestión que será la principal en nuestro proyecto, con su espacio de nombres (namespace) y las convenciones necesarias para que funcione en el marco de un package de Composer.

Iniciar Git en el proyecto y explicaciones sobre cómo crear funciones globales

Veremos cómo inicializar el repositorio Git para el control de versiones, que será necesario para publicar el package y configurar los flujos de trabajo. Además daremos unas notas sobre el trabajo con "helpers" que podrías tener en tu package con funciones globales, que no necesitamos, pero que te contamos por si acaso tú las quieres crear en un package.

Desarrollo de los tests unitarios

Todo package profesional debería tener sus propios tests. En este vídeo te explicamos cómo hacerlos y cómo configurar los namespaces específicos para desarrollo y para los test.

Ampliando los test de nuestra clase

Añadimos nuevos test al proyecto para completar nuestros casos de prueba, a fin de tener un package suficientemente robusto.

Personalizar la creación de claves

La idea de este package es crear claves que puedan personalizarse mediante código. En este vídeo veremos cómo crear un API fluída para que el uso de la clase sea muy sencillo e intuitivo, con el que podemos definir las características de la clave que se debe generar.

Iniciar un proyecto de package con Composer Gratis

Cómo iniciar un nuevo proyecto que pretendemos publicar en un package en Packagist. Entender el sistema de autoload, los namespaces que debemos configurar, la estructura del proyecto que se espera, etc.

Publicar un package en Packagist

Para que el package se pueda instalar vía Composer debemos publicarlo en Packagist. En los próximos vídeos veremos paso por paso cómo conseguir esta subida del package y cómo actualizar las versiones cuando sea necesario.

Conociendo Packagist

Antes de comenzar el proceso para publicar el package vamos a conocer algunos detalles de Packagist, que es el sitio que sirve de repositorio de paquetes open source desarrollados en PHP. Veremos algunas cosas interesantes sobre la documentación que nos entregan para explicar el proceso.

Subir el paquete a Packagist

En este vídeo vamos a subir el package a Packagist para que esté disponible ya para la comunidad de desarrolladores PHP. Veremos que es un proceso muy sencillo y veremos que, si hemos creado nuestra cuenta de Packagist con nuestro usuario de GitHub se define automáticamente el webhook necesario para que Packagist actualice el paquete cada vez que se cambia la release.

Cómo se actualiza un paquete en Packagist

En este vídeo veremos el proceso para actualizar el package, que consiste en crear una nueva tag en el repositorio Git y luego crear una release en GitHub con el mismo nombre. Una vez configurada, si hemos hecho bien el hook, la actualización es automática.

Comenzar un package de validación en PHP

Vamos a construir un segundo proyecto en este curso, más complejo que el anterior y que requerirá tener una jerarquía de clases y un diseño que permita su modularidad, extensibilidad y un fácil mantenimiento. Este segundo proyecto lo vamos a desarrollar además siguiendo el flujo de TDD.

Configuración de composer para el nuevo package

Comenzamos el proyecto de librería de validación para PHP, con la inicialización del proyecto y los namespace para el código de las clases y para el código de test.

Desarrollando el package con TDD

En este segundo proyecto de package vamos a aplicar un flujo de trabajo dirigido por pruebas, lo que sería el TDD. Veremos cómo vamos desarrollando el software siguiendo esta metodología.

Añadir nuevas reglas de validación

Vamos avanzando en el proyecto añadiendo reglas de validación, que básicamente es cómo va a escalar nuestro package. Veremos cómo aplicar la nueva regla y explicaremos cómo este código puede transformarse en un problema más adelante cuando tengamos decenas de reglas.

Lanzar excepción cuando nos envíen reglas de validación desconocidas

Cómo vamos a gestionar las reglas de validación desconocidas. Explicamos cómo se pueden levantar excepciones para asegurarnos que nadie nos llama mal y cómo podemos testear que estas excepciones ocurren.

Cómo informar los errores de validación

Cómo aplicar mejoras en nuestra biblioteca de validación para que también se pueda informar a quienes usan el package sobre los problemas encontrados al validar los datos.

Refactorización y aplicación de patrones

En los siguientes vídeos vamos a iniciar una serie de refactorizaciones para mejora del diseño de la biblioteca de validación y de los test unitarios de las clases.

Refactorización para mejora del diseño de las reglas de validación

Vamos a aplicar una mejora en la biblioteca de validación para conseguir mejorar el diseño, aplicando una mejor modularidad del software. Comenzamos convirtiendo cada método de validación de una regla particular en una clase.

Refactorización de diseño aplicando factoría y patrón strategy

En esta refactorización vamos a aplicar unas mejoras de un par de patrones conocidos. Vamos a crear una factoría para construir los objetos de validación y aplicar a la vez el patrón strategy, que conseguimos por haber puesto cada regla en su propia clase.

Aplicar data providers de PHPUnit para mejorar los test

Aplicamos la herramienta de los "data provider" que nos ofrece PHPUnit para mejorar la sencillez de los test y evitar escribir una y otra vez test que son prácticamente copiados de otros, lo que también impactará positivamente en la escalabilidad de las pruebas.

Crear reglas simples, parametrizadas y validador compuesto

Vamos a extender el código de la biblioteca creando reglas de validación simples y reglas de validación parametrizadas, para lo que necesitaremos nuevas maneras de proceder a la hora de parsear las reglas. Además vamos a hacer ya el validador compuesto, que permitiría no solamente validar campos sueltos, sino todo un array asociativo de datos de distintos campos.

Crear una regla para validar URL

Creamos una regla simple para mostrar lo sencillo que es ahora crear los métodos de test gracias a los data providers.

Crear reglas de validación parametrizadas

En esta ocasión vamos a crear reglas un poquito más complejas para poder resolver temas que más tarde o más temprano debería gestionar nuestra biblioteca de validación. Para ello veremos cómo crear reglas parametrizadas.

Refactor: separar a clase el parseador de reglas

Vamos a parar un momento la extensión para refactorizar el sistema de parseado de reglas de validación, creando una nueva clase que se especializará en esta tarea. Esta tarea es una refactorización para mejora del diseño, ya que no vamos a cambiar el API ni la funcionalidad.

Validador de un array asociativo de campos

En este vídeo completamos la funcionalidad de nuestra biblioteca de validación, creando un método que nos permite validar un array asociativo de datos de campos, como el típico que nos llegaría por formulario con $_POST o por querystring con $_GET. Con esto terminaremos, al menos por el momento, de ampliar la funcionalidad de la librería y podremos pasar a definir nuestro sistema de integración continua.

Implementar la Integración Continua

En los siguientes vídeos vamos a publicar el package en Packagist pero en esta ocasión queremos crear un sistema de CI (Continuous Integration) que nos permita correr las pruebas de manera automática cuando se producen los push o pull request a la rama main. Para ello vamos a usar GitHub Actions.

Publicar el paquete en Packagist

Explicamos los objetivos de esta etapa del curso: implementar un sistema de CI mediante GitHub Actions. Comenzamos por publicar este nuevo paquete en packagist, algo que haremos rápidamente porque ya conocimos el proceso en el vídeo anterior.

Desarrollar nuestro primer workflow de GitHub Actions

Creamos la primera versión del pipeline de integración continua, lo que se llama workflow en el contexto de GitHub Actions. Realizaremos una implementación sencilla para mantener las cosas simples y veremos cómo se ejecuta en GitHub, resolviendo posibles problemas típicos que nos podemos encontrar en el proceso.

Crear estrategias para probar el package con distintas versiones de PHP

De una manera simple podemos construir una matriz de versiones de PHP, que luego podemos usar para que nuestros jobs se ejecuten en cada una de ellas, de modo que podamos asegurar la compatibilidad del package en distintas versiones del lenguaje.

Hacer uso de la caché de Composer para mejorar el rendimiento del workflow

Con GitHub Actions podemos usar una caché de Composer, lo que nos permite que en distintas ejecuciones de los pipelines no se tengan que descargar una y otra vez las mismas dependencias, lo que ahorra tiempo en la instalación y mejora el rendimiento del workflow.

Cómo crear un workflow para publicar releases en GitHub

Realizamos una action para publicar la release de manera automática cuando cambia el tag de Git, de este modo podemos automatizar la publicación de versiones en Packagist, aunque siempre de manera controlada, porque la tag la tendremos que realizar de manera manual cuando consideremos oportuno liberar una nueva versión.

Flujo basado en pull request

Explicamos de manera resumida qué es un pull request y por qué son esenciales para los fluor de trabajo. Hasta ahora habíamos realizado siempre los procesos de CI cuando se hacía push a la rama main pero en este vídeo vamos a comprobar que también se ejecutan las action cuando se hace un pull request.

Configuración de la action de publicación de releases

Realizamos algunas configuraciones extraordinarias del workflow de publicación automática de releases.

Corrección del estilo del código con PHP CS Fixer

Ahora vamos a conocer una herramienta muy usada en los proyectos PHP profesionales para conseguir que el código de PHP sea muy consistente entre los desarrolladores. Se trata de PHP CS Fixer, que nos permite no solo validar que el estilo del código responde a unas configuraciones determinadas, sino que también es capaz de corregir nuestro estilo de codificación si encuentra inconsistencias.

Primeros pasos con PHP CS Fixer

Presentamos este paquete para verificación y corrección del estilo de codificación de los proyectos PHP. Instalamos la dependencia y la configuramos adecuadamente, resolviendo problemas derivados de la versión de PHP que podamos estar ejecutando.

Cambiar la versión de PHP para poder usar CS Fixer adecuadamente

En este vídeo veremos cómo cambiar la versión de PHP que estamos usando en nuestro ordenador. Ese es un problema particular que hemos encontrado por nuestra propia configuración de PHP pero que no todos pueden tener.

Ejecutando PHP CS Fixer de manera correcta con la versión de PHP necesaria

En este vídeo mostramos que, una vez cambiada la versión de PHP que ejecutamos en loca, CS Fixer ya es capaz de ejecutarse de manera correcta, sin mostrar mensajes de warning.

Aplicación de reglas risky de PHP CS Fixer

Entre las cosas que podemos hacer para corregir el estilo del código PHP hay reglas normales y otras reglas calificadas como "risky". En este vídeo veremos qué tipos de reglas pueden ser arriesgadas y qué consideraciones especiales debemos tener en cuenta cuando las aplicamos.

Añadir CS Fixer al proceso de integración continua

Veremos cómo podemos añadir la comprobación del estilo de codificación PHP a nuestro workflow de CI, mediante la ejecución del comando de PHP CS Fixer en el proyecto

Usar nuestro propio package en un proyecto PHP

Por fin tenemos un package profesional robusto, consistente y con una funcionalidad adecuada. Ha llegado la hora de publicarlo y usarlo en otros proyectos de PHP. Además explicaremos cómo se debe presentar la práctica para obtención del certificad

Configuración de análisis de Composer y publicación de release

Realizamos las últimas operaciones y análisis automatizado con composer para la publicación de una nueva versión de nuestra librería de validación.

Usar el package de validación en una aplicación PHP

Cómo usar nuestro package de biblioteca de validación en un proyecto, instalando vía composer y realizando la validación de datos que vienen desde un formulario en una página PHP.

Cómo obtener el certificado del curso

Para obtener el certificado del curso de Desarrollo de Packages para Composer necesitas hacer una práctica. Te lo explicamos en el siguiente vídeo.

Enunciado de la práctica del curso de desarrollo de packages con Composer

Explicamos en qué consiste la práctica final del curso, que tendrás que realizar para obtener el certificado de realización del curso de desarrollo de packages para PHP y Composer.

Epílogo: corrección del diseño por Luis Fernández

En el Curso de Diseño de Software impartido por el profesor Luis Fernández se realizó la corrección del diseño de este package. Aparecieron muchas correcciones y mejoras que vamos a ver implementadas en los siguientes vídeos.

Refactors de legibilidad

Aplicación de numerosos refactors que tienen que ver con los principios relacionados con la legibilidad del código.

Refactors de ocultación

Refactorizaciones para seguir los principios de ocultación y abstracción.

Refactors de modularidad

Aplicación de varias refactorizaciones que se realizan para adoptar distintos principios de modularidad.

Refactor renombrar las clases Rule a Validator (simples)

Para simplificar, minimizando y unificando, se hace una refactorización en la que el concepto de rule se aplica como un validador, habiendo en el proyecto validadores simples y compuestos.

Cambiar la interfaz de los validadores simples

Los cambios anteriores nos llevan a producir cambios en la interfaz de los validadores simples.

Enviar reglas en el constructor

Se ha decidido que es más claro que al construir un objeto validador se le manden las reglas que tiene que aplicar cuando le piden validar. De este modo también se consigue que la interfaz de un validador compuesto se adapte a un validador simple.

Cambiar el readme y lanzar nueva release

Con todos estos cambios se ha modificado el API de nuestra biblioteca de validación, por lo que actualizamos el readme y publicamos una nueva versión que tiene breaking changes.

Llevar la lógica de las reglas parametrizadas al propio validador

En el caso de la regla parametrizada "max:", se ha decidido que el parseo lo debe realizar el propio validador, lo que mejora la cohesión y la abstracción.

Aplicación de diseño por contrato con precondiciones

En la clase ValidatorsFactory aplicamos diseño por contrato, creando una precondición para que no nos llamen si no nos entregan una lista correcta de nombres de reglas de validación.

Matched rule usando estrategias de validación

Con los cambios del vídeo anterior ha quedado patente nuestro patrón strategy para modularización de los validadores simples y esos cambios hacen adecuado basarse en el catálogo de estrategias cuando queremos ver si una regla de validación hace match con alguno de los validadores existentes.

Epílogo 2: Mejoras de diseño por patrón composite solicitadas por Luis Fernández

Después de una segunda sesión de correcciones de diseño que ha realizado el profesor Luis Fernández sobre el proyecto de validador en PHP, en el Curso de Diseño de Software, tenemos nuevas mejoras que aplicar. Vamos a abordar distintos puntos pero sobre todo vamos a aplicar un patrón composite para poder validar a varios niveles manteniendo una única interfaz.

Propuesta patrón composite

En este vídeo simplemente adelantamos las mejoras que queremos conseguir en las próximas clases, explicando cómo es el modo de trabajo que queremos conseguir, usando el patrón composite.

Cambios de nombres

Antes de comenzar a cambiar las clases para adaptarnos a la nueva interfaz de trabajo, vamos a realizar los cambios en algunas clases y propiedades que nos solicitó Luis en la pasada corrección.

Desarrollo del composite desde ValidatorsFactory

Vamos a comenzar el desarrollo de las mejoras de nuestro package implementando un método create() dentro de ValidatorsFactory, para que pueda ayudarnos a crear validadores de diversos tipos, atendiendo al formato de las reglas de validación que le entreguemos.

Eliminar un ciclo entre nuestras clases

En el vídeo anterior se detectó que existe un ciclo en nuestras clases y queremos eliminarlo para evitar ese problema de diseño.

Precondiciones de validación

En este video vamos a aplicar un poco de diseño por contrato para definir unas precondiciones que serán comprobadas antes de ejecutar los métodos de validación. Para ello mejoraremos los test para encontrar los casos que podrían dar problemas, para luego actualizar las clases del package.

Realizamos mejoras en FieldValidator y sus test

Acabamos este proceso de mejoras de diseño implementando unas precondiciones con asserts, para asegurarnos que se crean los validadores de campos enviando los parámetros correctos al constructor. Además veremos cómo hacer tests que verifiquen que los asserts funcionan y, por último, cómo configurar PHPUnit para que los asserts también estén activos en el entorno de ejecución de las pruebas en GitHub Actions, de modo que los tests funcionen bien también en el entorno de pruebas de Continuous Integration.

Cursos que también te pueden interesar

¿Conoces nuestra tarifa plana?

Toda la formación de EscuelaIT, con más de 200 cursos completos para aprender las más variadas tecnologías de programación, diseño y marketing online. Todo! con tu suscripción.

Suscríbete