Saltar a contenido

Composer

Conceptos previos

Librería

Una librería en programación es un conjunto de funciones, métodos o clases preescritas que se pueden utilizar para realizar tareas comunes sin necesidad de reescribir código desde cero. Las librerías están diseñadas para ser reutilizables y para proporcionar una manera de acceder a funcionalidades específicas mediante una API (Interfaz de Programación de Aplicaciones) bien definida. En PHP, las librerías pueden incluir operaciones para trabajar con fechas, manipulación de imágenes, operaciones de red, etc.

El uso de librerías permite a los desarrolladores ahorrar tiempo, reducir errores al depender de código ya probado y mantenible, y mejorar la calidad general del software.

Framework

Un framework, en cambio, ofrece una estructura y un enfoque más amplio que una librería. No sólo proporciona librerías y APIs, sino también un marco de trabajo predefinido para desarrollar aplicaciones. Un framework puede dictar la arquitectura de tu proyecto con patrones de diseño específicos, componentes integrados y convenciones que deben seguirse.

En PHP, frameworks como Laravel, Symfony, y CakePHP ofrecen herramientas y componentes para manejar rutas, solicitudes HTTP, acceso a bases de datos, y más, facilitando el desarrollo de aplicaciones robustas y escalables siguiendo buenas prácticas.

Composer

Herramienta por excelencia en PHP para la gestión de librerías y dependencias, que instala y actualiza estas, asegurando que todo el equipo de desarrollo tiene el mismo entorno y versiones. Además, ofrece autoloading de nuestro código, de modo que no tengamos que hacerlo nosotros "a mano".

Está escrito en PHP, y se puede consultar toda su documentación en https://getcomposer.org/.

Utiliza Packagist como repositorio de librerías.

Funcionalmente, es similar a Maven (Java) / npm (JS).

La necesidad de Composer

Con el crecimiento en el uso de librerías y frameworks, surge el problema de gestionar todas estas dependencias de manera eficiente. Aquí es donde entra Composer:

Composer es un sistema de gestión de dependencias para PHP que facilita la instalación y actualización de librerías y frameworks. Permite a los desarrolladores declarar las bibliotecas de las que depende su proyecto y las maneja (instala/actualiza) por ellos. Composer trabaja con "packagist.org", que es el repositorio por defecto para paquetes PHP, donde se pueden buscar y descargar las librerías y frameworks necesarios para un proyecto.

Gracias a Composer, los desarrolladores pueden:

  • Mantener un control claro de las versiones de las librerías usadas.
  • Automatizar la instalación y actualización de dependencias.
  • Resolver conflictos de dependencias eficientemente.
  • Contribuir a una gestión más profesional y mantenible del código base.

Instalación

Si estamos usando XAMPP, debemos instalar Composer en el propio sistema operativo. Se recomienda seguir las instrucciones oficiales según el sistema operativo a emplear.

En cambio, si usamos Docker, necesitamos modificar la configuración de nuestro contenedor. En nuestro caso, hemos decidido modificar el archivo Dockerfile y añadir el siguiente comando:

COPY --from=composer:2.0 /usr/bin/composer /usr/local/bin/composer

Para facilitar el trabajo, hemos creado una plantilla ya preparada.

Es importante que dentro del contenedor comprobemos que tenemos la v2:

composer -V

Primeros pasos

Cuando creemos un proyecto por primera vez, debemos inicializar el repositorio. Para ello, ejecutaremos el comando composer init donde:

  • Configuramos el nombre del paquete, descripción, autor (nombre ), tipo de paquete (project), etc...
  • Definimos las dependencias del proyecto (require) y las de desarrollo (require-dev) de manera interactiva.
    • En las de desarrollo se indica aquellas que no se instalarán en el entorno de producción, por ejemplo, las librerías de pruebas.

Tras su configuración, se creará automáticamente el archivo composer.json con los datos introducidos y descarga las librerías en la carpeta vendor. La instalación de las librerías siempre se realiza de manera local para cada proyecto.

{
    "name": "dwes/log",
    "description": "Pruebas con Monolog",
    "type": "project",
    "require": {
        "monolog/monolog": "^2.1"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "Ginés López",
            "email": "g.lopezgarcia2@edu.gva.es"
        }
    ]
}

A la hora de indicar cada librería introduciremos:

  • el nombre de la librería, compuesta tanto por el creador o "vendor", como por el nombre del proyecto. Ejemplos: monolog/monolog o laravel/installer.
  • la versión de cada librería. Tenemos diversas opciones para indicarla:

    • Directamente: 1.4.2
    • Con comodines: 1.*
    • A partir de: >= 2.0.3
    • Sin rotura de cambios: ^1.3.2 // >=1.3.2 <2.0.0

Actualizar librerías

Podemos definir las dependencias via el archivo composer.json o mediante comandos con el formato composer require vendor/package:version. Por ejemplo, si queremos añadir phpUnit como librería de desarrollo, haremos:

composer require phpunit/phpunit –dev

Tras añadir nuevas librerías, debemos actualizar nuestro proyecto:

composer update

Si creamos el archivo composer.json nosotros directamente sin inicializar el repositorio, debemos instalar las dependencias:

composer install

Al hacer este paso (tanto instalar como actualizar), como ya hemos comentado, se descargan las librerías dentro de la carpeta vendor. Es muy importante añadir esta carpeta al archivo .gitignore para no subirlas a GitHub.

Además se crea el archivo composer.lock, que almacena la versión exacta que se ha instalado de cada librería (este archivo no se toca).

autoload.php

Composer crea de forma automática en vendor/autoload.php el código para incluir de forma automática todas las librerías que tengamos configuradas en composer.json.

Para utilizarlo, en la cabecera de nuestro archivos pondremos:

<?php
require 'vendor/autoload.php';

En nuestro caso, de momento sólo lo pondremos en los archivos donde probamos las clases. Si queremos que Composer también se encargue de cargar de forma automática nuestras clases de dominio, dentro del archivo composer.json, definiremos la propiedad autoload:

"autoload": {
    "psr-4": {"Dwes\\": "app/Dwes"}
},

Posteriormente, debemos volver a generar el autoload de Composer mediante la opción dump-autoload (o du):

composer dump-autoload

Actividades

  • 📝 AC 501. (RA4 RA5 / CE4f CE5h / IC1 / 3p) - Se ha de introducir el uso de Composer para administrar las dependencias de PHP. Para ello:

    • Crea un nuevo directorio para el proyecto y navega hasta él en la línea de comandos.
    • Utiliza Composer para inicializar un nuevo proyecto PHP ejecutando el comando composer init. Sigue las instrucciones para completar la configuración básica del proyecto.
    • Añade una dependencia simple al proyecto. Por ejemplo, puedes utilizar el paquete monolog/monolog para registrar mensajes de registro.
    • Crea un script PHP en el proyecto que utilice la funcionalidad proporcionada por la dependencia agregada.
    • Ejecuta el script PHP y verifica que la dependencia funcione correctamente.
  • 🔬 AP 502. (RA4 RA5 / CE4f CE5h / IC1 / 3p) - A raíz de la actividad AC 414, has de realizar la siguiente gestión de dependencias con Composer:

    • Utiliza un proyecto PHP existente en tu computadora que tenga un archivo composer.json con algunas dependencias predefinidas.
    • Analiza detenidamente el archivo composer.json para comprender las dependencias incluidas en el proyecto.
    • Realiza al menos dos de las siguientes acciones en el proyecto:
      • Agrega una nueva dependencia al archivo composer.json.
      • Actualiza una dependencia existente a una versión más reciente.
      • Elimina una dependencia del archivo composer.json.
    • Después de realizar los cambios, ejecuta composer install para actualizar las dependencias del proyecto según lo modificado en el archivo composer.json.
    • Una vez actualizadas las dependencias, ejecuta pruebas unitarias si están disponibles en el proyecto para asegurarte de que las modificaciones no hayan introducido errores.
    • Documenta los cambios realizados en el archivo composer.json y cualquier problema que hayas encontrado durante el proceso de actualización de dependencias.
    • Reflexiona sobre la importancia de utilizar Composer y la gestión adecuada de dependencias en proyectos PHP.