Creación y publicación de paquetes en Laravel
En el desarrollo de aplicaciones es común escribir mucho código que se utiliza repetidamente en diferentes proyectos. Para simplificar este proceso, existen los paquetes, que consisten en un conjunto de archivos y código encapsulado, ya sea propio o de terceros. Utilizar paquetes nos permite implementar funcionalidades de manera más fácil, ahorrando tiempo y esfuerzo en el proceso.
Laravel y PHP ofrecen una gran cantidad de herramientas y recursos para el desarrollo de paquetes, permitiéndonos desacoplar nuestras aplicaciones en diferentes partes, facilitando el mantenimiento y la escalabilidad a largo plazo.
En este artículo, crearemos un paquete básico llamado Session Checker, y tendrá como objetivo verificar si un usuario tiene una sesión abierta. En caso de que sí, le informará que ha sido cerrada. De esta manera, se evita que los usuarios tengan varias sesiones abiertas al mismo tiempo y se mejora la seguridad y confiabilidad de la aplicación.
¿Cómo crear un paquete en Laravel?
Para desarrollar paquetes en Laravel es necesario utilizar Composer, el gestor de dependencias para PHP. Composer es una herramienta muy útil que ayuda a los desarrolladores a administrar las bibliotecas y dependencias necesarias en cada proyecto de manera organizada y eficiente. Generalmente, se especifican las dependencias del proyecto en un archivo composer.json y luego se instalan todas las dependencias con un solo comando. Composer también se encarga de actualizar automáticamente las dependencias cuando se lanzan nuevas versiones.
Crear la estructura básica de un paquete
- Crea una carpeta llamada Listopro (o el nombre que desees) en el directorio donde trabajas. Esta carpeta será la base de tu proyecto.
- Dentro de la carpeta Listopro, crea una carpeta llamada packages, la cual contendrá todos tus paquetes personalizados.
- Dentro de la carpeta packages, crea una carpeta con el nombre de tu usuario de GitHub. En mi caso, usaré nicotc.
- Dentro de la carpeta nicotc, crea una carpeta con el nombre de tu paquete personalizado. En este caso, puedes nombrarlo session-checker.
- Dentro de la carpeta session-checker, crea una carpeta llamada src, la cual contendrá todo el código fuente de tu paquete.
Tu árbol de carpetas se verá de la siguiente manera:
- Listopro
- packages
- nicotc (tu nombre de usuario Github)
- session-checker (nombre de tu paquete)
- src
Crear un archivo composer.json para tu paquete personalizado
En esta sección, te mostraré cómo crear un archivo composer.json para tu paquete session-checker. Sigue estos pasos:
1) Abre tu terminal y navega hasta la carpeta.
Listopro/packages/nicotc/session-checker.
2) Ejecuta el comando composer init. Este comando iniciará el asistente de creación de paquetes de Composer y te guiará a través del proceso para crear el archivo composer.json.
Recuerda en la pregunta minimum-stabilit:"stable".
3) Sigue las instrucciones del asistente y proporciona la información necesaria sobre tu paquete, como el nombre, la descripción, el autor, la licencia, la versión, etc.
4) Una vez que hayas completado el asistente, se creará un archivo composer.json en la carpeta Listopro/packages/nicotc/session-checker. Este archivo contendrá toda la información que proporcionaste durante el proceso de creación.
5) Aprovechemos de una vez y ejecutemos composer require illuminate/support.
Agregar funcionalidad a nuestro paquete
Ahora que hemos creado un archivo composer.json para nuestro paquete session-checker, es hora de agregarle funcionalidad. Como se mencionó anteriormente, nuestro paquete verificará si un usuario tiene una sesión abierta en otro navegador y mostrará un mensaje si es el caso.
Para agregar esta funcionalidad, primero necesitamos crear una clase que maneje la lógica de nuestro paquete. Abre tu IDE de preferencia en la carpeta Listopro. Desde allí, navega hasta la carpeta packages/nicotc/session-checker/src.
Dentro de la carpeta /src, crea un nuevo archivo llamado SessionChecker.php.
En este archivo, crearemos una clase llamada SessionChecker que manejará la lógica de nuestro paquete. Aquí tienes un ejemplo de cómo podría verse esta clase:
Modificar el archivo composer.json para incluir la clase SessionChecker en el autoloading de Composer
En esta sección, te mostramos cómo agregar la clase SessionChecker que creamos anteriormente al archivo composer.json de nuestro paquete session-checker. Al hacerlo, permitimos que Composer cargue automáticamente la clase en nuestra aplicación Laravel, sin necesidad de importarla manualmente en cada archivo.
1) Abre el archivo composer.json en la carpeta raíz de tu proyecto Laravel.
2) Agrega una sección autoload como se muestra a continuación:
Tu archivo debe verse tal y como se muestra en la siguiente imagen:
3) Ejecuta el comando composer dump en tu terminal para actualizar el archivo autoload.php de Composer.
Crear un laravel de pruebas
Vamos ahora a probar nuestro paquete. Para ello, creamos y configuramos nuestro Laravel de pruebas.
Abre tu terminal y navega hasta la carpeta Listopro. Una vez en esta carpeta, ejecuta lo siguiente para instalar Laravel:
Ve a nuestro proyecto /laravel y ejecuta lo siguiente:
Tu árbol de carpetas debe verse de esta manera:
Abre el archivo .env ubicado en la raíz de tu proyecto Laravel, agrega la conexión a la base de datos y cambia SESSION_DRIVER=file por SESSION_DRIVER=database.
Ahora ejecuta:
Cargar nuestro paquete en el composer
En nuestro editor vamos a abrir el composer.json de Laravel y agregamos:
Regresamos al terminal y ejecutamos:
Abre el archivo \app\Http\Controllers\Auth\LoginController.php y agregar esto:
Nuestro LoginController.php debe quedar así:
Prueba de nuestro paquete
Después de haber cargado y registrado nuestro paquete session-checker en nuestra aplicación Laravel, es momento de probar su funcionalidad.
Para hacerlo, abre dos navegadores diferentes (por ejemplo, Google Chrome y Firefox) y accede a tu aplicación Laravel en ambos. Inicia sesión en uno de ellos y luego en el otro. Verás una notificación de que se ha cerrado una sesión en uno de los navegadores. Ahora regresa al primer navegador y actualiza la página. Verás que habrás sido deslogueado automáticamente.
Esta funcionalidad es posible gracias a la clase SessionChecker que creamos en nuestro paquete session-checker. La clase verifica cuando un usuario inicia sesión y se encuentra logueado en otro navegador y, si está logueado, cierra la sesión y permite el nuevo ingreso.
Publicar nuestro paquete en packagist.org
Si deseas compartir el paquete y así contribuir con la comunidad de desarrollo de PHP, puedes publicarlo en packagist.org,un sitio web donde se pueden encontrar y descargar paquetes de código fuente PHP, reutilizables en diferentes proyectos.
Para publicar un paquete de Laravel, lo primero que necesitamos es una cuenta en https://github.com/. Créala si no la tienes o inicia sesión con una existente. Luego genera un nuevo repositorio con el mismo nombre de tu paquete session-checker. Hecho esto, ve a tu paquete local en el terminal:
/packages/nicotc/session-checker/
y ejecuta:
Crea un archivo .gitignore y agrega:
Luego continúa en la consola:
Ingresa ahora en https://packagist.org/ y crea una cuenta (o inicia sesión con una existente). Busca en el menú submit y pega aquí la url de tu paquete tal como en la imagen:
A continuación, borra del composer.json de tu Laravel las siguientes líneas:
Ejecuta en la terminal:
Y luego:
Si el paquete ya está cargando en packagist, es probable que muestre una alerta como la siguiente imagen:
Para resolver el problema, haz clic en el vínculo connect it on you profile, ingresa en tu cuenta de GitHub y ¡listo!
Crear un readme y una licencia
En Git puedes agregar un readme que en el cual puedes especificar la forma en cómo se instala, cómo se usa el paquete y todo los datos que quieras colocar:
Aquí mismo lo podemos crear haciendo clic en el botón Add a README.
Puedes usar esta página para obtener algunos ejemplos:
Luego, en el siguiente vínculo tienes la licencia que usaremos (MIT):
https://choosealicense.com/licenses/mit/#
Creamos un nuevo archivo en GitHub y lo llamaremos LICENSE.md.
Será el mismo contenido del vínculo anterior. Le cambiamos el año y colocamos nuestro nombre.
Vamos a la terminal nuevamente de nuestro paquete creado localmente:
Y descargamos los cambios creados en nuestro GitHub:
Abrimos el archivo composer.json ubicado en la raíz de nuestro Laravel y agregamos justo abajo de la línea descripción:
Para finalizar, ejecutamos los siguientes comandos:
Conclusión
Hemos aprendido cómo hacer un paquete estilo “hola mundo”. Ahora te invito a expandir las funcionalidades del paquete session-checker, ya que puede ser una excelente oportunidad para mejorar tus habilidades de programación y contribuir con la comunidad de desarrolladores.
Hay muchas posibilidades que puedes explorar para agregar nuevas características útiles al paquete. A continuación, te dejo algunas ideas:
- Realizar una migración que añada el campo deleted_at a la tabla de sesiones que crea Laravel. Del mismo modo, haz un modelo para que puedas usar el soft delete y así no se borrarán las sesiones. A partir de aquí, tú pones los límites a tu imaginación.
- Crear un envío de notificaciones por email.
- Crear algunas rutas con sus respectivos controladores y vistas, donde un usuario pueda ver su historial de ingreso.
- Hacer que un administrador pueda cerrar la sesión a un usuario de la aplicación.
- Hacer un bloqueo de usuarios por medio de un campo adicional en la tabla.
Tienes un sinfín de posibilidades para explorar.
Recuerda que esto es un primer nivel de desarrollo y que puedes hacer paquetes tan simples como éste o con la complejidad que desees o requieras.
El desarrollo de paquetes en Laravel es una herramienta poderosa y flexible que nos permite crear soluciones personalizadas para nuestras aplicaciones. Su manejo nos puede ayudar a mejorar la organización y modularidad de nuestro código, lo que a su vez puede facilitar el mantenimiento y la escalabilidad de nuestros proyectos.
Dejo el vínculo del repositorio GitHub y te invito a contribuir en este pequeño paquete.
Si tienes alguna duda o pregunta, puedes contactarme por LinkedIn.
¡Hasta luego!
Listopro Community da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.