©2025 Escuela Tecnologías de la Información S.L. Todos los derechos reservados.
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
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.
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
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
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
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.
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.
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.
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.
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.
Añadimos nuevos test al proyecto para completar nuestros casos de prueba, a fin de tener un package suficientemente robusto.
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.
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.
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.
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.
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.
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.
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.
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.
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 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.
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.
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.
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.
Creamos una regla simple para mostrar lo sencillo que es ahora crear los métodos de test gracias a los data providers.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
Aplicación de numerosos refactors que tienen que ver con los principios relacionados con la legibilidad del código.
Refactorizaciones para seguir los principios de ocultación y abstracción.
Aplicación de varias refactorizaciones que se realizan para adoptar distintos principios de modularidad.
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.
Los cambios anteriores nos llevan a producir cambios en la interfaz de los validadores simples.
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.
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.
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.
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.
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.
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.
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.
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.
En el vídeo anterior se detectó que existe un ciclo en nuestras clases y queremos eliminarlo para evitar ese problema de diseño.
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.
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.
¿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.