composer

Conceptos Fundamentales

  • Gestor de paquetes
    • Administra dependencias externas de PHP.
    • Maneja versiones, compatibilidad y restricciones (semver).
    • Permite entornos reproducibles mediante composer.lock.
  • Scripts
    • Automatización de tareas comunes (post-install, pre-update, comandos personalizados).
    • Integración con herramientas CI/CD.
  • Autoloading
    • Uso de PSR-4 y PSR-0.
    • Carga automática de clases sin require manual.
    • Integración con namespaces.
  • Comandos principales
    • composer init → Crear composer.json.
    • composer require → Añadir dependencias.
    • composer install → Instalar dependencias listadas.
    • composer update → Actualizar dependencias.
    • composer dump-autoload → Regenerar autoload.
  • Mapeo de clases
    • Definición manual de directorios → namespaces.
    • Configuración de autoload:
      • "psr-4"
      • "classmap"
      • "files"
  • Packages
  • Namespaces
    • Base para PSR-4.
    • Permite evitar colisiones de clases.
    • Facilita modularización y arquitectura limpia.

Arquitectura y Flujos Internos

  • composer.json
    • Metadatos del proyecto.
    • Dependencias, scripts, autoload, repositorios, configuraciones.
  • composer.lock
    • Fijación exacta de versiones.
    • Determinismo en despliegues.
  • Vendor
    • Carpeta con dependencias instaladas.
    • Contiene autoloader generado.
  • Repositorios
    • Packagist (principal).
    • Repos privados (Git, archivos locales, endpoints API).
  • Resolución de dependencias
    • Algoritmo SAT.
    • Análisis de compatibilidad.
    • Selección óptima de versiones según restricciones.

Ciclos de Trabajo Recomendados

  • Proyecto nuevo
    • composer init
    • Añadir dependencias base
    • Configurar autoload PSR-4
  • Proyecto existente
    • composer install
    • Verificar composer.lock
  • Producción
    • composer install --no-dev --optimize-autoloader
  • Desarrollo
    • Scripts personalizados (ex.: testing, linting, build).
    • Autoload en modo desarrollo.

Integraciones Comunes

  • Frameworks
    • Laravel, Symfony, Slim, Lumen.
  • Testing
    • PHPUnit, Pest.
  • Quality Tools
    • PHPStan
    • Psalm
    • PHPCS
  • Logs / Utilidades
    • Monolog
    • Dotenv
    • Carbon (fechas)

Buenas Prácticas

  • Usar siempre composer.lock en producción.
  • Especificar restricciones semver sensatas (^ para libs nuevas, ~ para libs críticas).
  • No versionar la carpeta vendor.
  • Mantener scripts organizados y con propósito claro.
  • Evitar dependencias excesivas — revisar impacto antes de incorporarlas.
  • Separar dependencias require vs require-dev.

Videos

Código: Ejemplos de composer.json Básico

{
	"name": "miapp/proyecto",
	"description": "Ejemplo básico",
	"require": {
		"monolog/monolog": "^3.0"
	},
	"autoload": {
		"psr-4": {
			"App\\": "src/"
		}
	}
}

`

Código: Scripts Personalizados

{
	"scripts": {
		"test": "phpunit",
		"lint": "phpcs --standard=PSR12 src"
	}
}

Código: Autoload Avanzado con classmap

{
	"autoload": {
		"classmap": [
			"src/Legacy/"
		]
	}
}

Código: Repositorio Privado

{
	"repositories": [
		{
			"type": "vcs",
			"url": "https://github.com/mi-org/mi-lib"
		}
	]
}

Composer — Glosario

Conceptos Generales

  • Composer
    Gestor de dependencias para PHP que administra librerías externas, versiones, scripts y el autoloading de clases.
  • Dependencia
    Paquete externo requerido por un proyecto para funcionar.
  • Packagist
    Repositorio principal de paquetes compatibles con Composer.
  • Semver (Versionado Semántico)
    Estándar de versionado basado en MAJOR.MINOR.PATCH.

Archivos Clave

  • composer.json
    Archivo de configuración principal: define dependencias, scripts, autoload y metadatos del proyecto.
  • composer.lock
    Archivo generado automáticamente que fija versiones exactas para garantizar reproducibilidad.
  • vendor/
    Directorio creado por Composer donde se almacenan todas las dependencias instaladas.

Autoloading

  • PSR-4
    Estándar de autoloading que mapea namespaces a directorios.
  • PSR-0
    Estándar legado donde el nombre de la clase define su ruta de archivo.
  • classmap
    Mecanismo para mapear archivos o directorios completos a clases específicas.
  • files autoload
    Permite cargar archivos PHP de forma automática sin uso de clases (ej. helpers).

Comandos

  • composer init
    Inicializa un nuevo proyecto generando un composer.json.
  • composer require
    Añade una nueva dependencia al proyecto.
  • composer install
    Instala dependencias definidas en composer.lock o composer.json.
  • composer update
    Actualiza dependencias a las versiones permitidas.
  • composer dump-autoload
    Regenera el autoloader, útil después de cambios en clases.

Scripts y Automatización

  • Scripts de Composer
    Tareas automáticas configuradas en composer.json como pre-install, post-update o comandos personalizados.
  • Hooks
    Ejecuciones automáticas disparadas por eventos internos de Composer.

Paquetes y Versionado

  • Paquete (Package)
    Unidad de distribución en Composer, definida por nombre, versión y metadatos.
  • Constraint de versión
    Restricciones usadas para seleccionar versiones compatibles (^, ~, >=, dev-master, etc.).
  • Repositorios personalizados
    Fuentes alternativas a Packagist: Git, archivos locales, Satis, APIs.

Integraciones

  • Monolog
    Paquete de logging muy popular en el ecosistema PHP.
  • PHPUnit / Pest
    Herramientas de testing comúnmente instaladas mediante Composer.
  • PHPStan / Psalm
    Herramientas de análisis estático integradas en el flujo mediante scripts.

Arquitectura Interna

  • SAT Solver
    Algoritmo utilizado por Composer para resolver dependencias y compatibilidades.
  • Mini repositorio local
    Caché donde Composer guarda paquetes descargados para acelerar instalaciones posteriores.
  • Autoloader
    Archivo generado por Composer encargado de cargar clases automáticamente (vendor/autoload.php).

Buenas Prácticas

  • No versionar vendor/
    La carpeta debe generarse siempre mediante composer install.
  • Usar requerimientos precisos
    Controlar actualizaciones inesperadas mediante restricciones de versión bien definidas.
  • Distribuir proyectos con composer.lock
    Especialmente importante en producción.
  • Separar dependencias de producción y desarrollo
    Usar require vs require-dev.