Composer es el gestor de paquetes de PHP. Ejecuta composer require vendor/package en la carpeta de tu proyecto: Composer descarga la librería en vendor/, la registra en composer.json, y la cargas, junto con todo lo demás que hayas instalado, con una sola línea, require __DIR__ . '/vendor/autoload.php';.
composer require monolog/monolog
<?php
require __DIR__ . '/vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Level;
$log = new Logger('app');
$log->pushHandler(new StreamHandler(__DIR__ . '/app.log', Level::Warning));
$log->warning('Disk almost full', ['free' => '2%']);
Sin un include para cada archivo: el autoloader carga Logger, StreamHandler y todo lo que usan la primera vez que se necesita cada clase. Los paquetes vienen de Packagist, el registro público en el que Composer busca por defecto.
Instalar Composer
Composer necesita antes PHP en tu equipo (consulta instalar PHP).
Windows: descarga y ejecuta Composer-Setup.exe desde getcomposer.org. Encuentra tu php.exe y añade composer al PATH. Abre después una terminal nueva.
macOS con Homebrew:
brew install composer
Linux: el paquete de tu distribución (sudo apt install composer en Debian y Ubuntu) funciona, pero suele ser una versión antigua. El instalador oficial da la actual:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/local/bin/composer
La página de descarga de getcomposer.org también muestra una línea que comprueba el hash del instalador antes de ejecutarlo; copia los comandos de ahí para obtener el hash actual. Luego comprueba que funciona:
composer --version
composer.json y composer.lock
composer init hace unas cuantas preguntas y escribe composer.json, o bien composer require lo crea con el primer paquete. Uno típico:
{
"name": "acme/shop",
"require": {
"php": ">=8.2",
"monolog/monolog": "^3.0",
"vlucas/phpdotenv": "^5.6"
},
"require-dev": {
"phpunit/phpunit": "^11.0"
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
requireenumera lo que el proyecto necesita para funcionar, incluida la versión de PHP.require-devenumera herramientas solo para desarrollo (tests, análisis estático).composer require --dev phpunit/phpunitañade a esta lista, ycomposer install --no-devla omite en los servidores de producción.autoloadle dice a Composer dónde están tus propias clases (más abajo).
A su lado, Composer escribe composer.lock con la versión exacta de cada paquete que instaló, incluidos los paquetes de los que dependen tus paquetes. Sube los dos archivos al repositorio. No subas vendor/: añádelo a .gitignore, porque composer install lo reconstruye a partir del archivo lock.
composer install vs composer update
composer install # install exactly what composer.lock says
composer update # pick the newest allowed versions, rewrite composer.lock
composer update monolog/monolog # update one package only
composer remove monolog/monolog # uninstall and remove from composer.json
composer outdated # list packages with newer versions available
Ejecuta composer install después de clonar un proyecto y en cada despliegue: todo el mundo obtiene las mismas versiones que se probaron. Ejecuta composer update solo cuando quieras actualizar, y luego prueba y sube el nuevo composer.lock. Ejecutar update en un servidor de producción instala versiones que nadie ha probado.
Restricciones de versión: ^ y ~
| Restricción | Permite | Úsala para |
|---|---|---|
^3.2 | De la 3.2.0 a la 4.0.0, sin incluirla | La opción normal: funciones y correcciones, sin una versión mayor que rompa |
^0.4 | De la 0.4.0 a la 0.5.0, sin incluirla | Paquetes anteriores a la 1.0, donde las versiones menores pueden romper |
~3.2 | De la 3.2.0 a la 4.0.0, sin incluirla | Igual que ^3.2 |
~3.2.1 | De la 3.2.1 a la 3.3.0, sin incluirla | Solo correcciones |
3.2.1 | Exactamente la 3.2.1 | Rara vez; bloquea las correcciones de seguridad |
>=3.2 <3.5 | Un rango personalizado | Esquivar una versión defectuosa |
composer require vendor/package sin versión elige la versión estable más reciente y escribe una restricción ^ para ella, que normalmente es lo que quieres.
Autoload de tus propias clases con PSR-4
PSR-4 es la convención que asigna un namespace a una carpeta: con "App\\": "src/", la clase App\Text\Slug está en src/Text/Slug.php. Después de añadir la sección autoload, ejecuta:
composer dump-autoload
El autoloader de Composer es una función registrada con spl_autoload_register(), a la que PHP llama cada vez que el código usa una clase que aún no se ha cargado. Este bloque escribe dos archivos de clase y registra un pequeño autoloader PSR-4 propio, para que veas funcionar la asignación. Añade un tercer archivo de clase y úsalo.
El autoloader se ejecuta una vez por clase: la segunda llamada a Slug::from() no imprime ninguna línea autoload:, porque la clase ya está cargada. En un proyecto real nunca escribes tú esta función; vendor/autoload.php registra la versión de Composer, que además maneja los paquetes de vendor/. Los namespaces se explican en la página de namespaces.
Errores frecuentes
Class "Monolog\Logger" not found. El script no hizorequire 'vendor/autoload.php', o la ruta es incorrecta. Usa__DIR__ . '/vendor/autoload.php'para que la ruta no dependa del directorio actual.- No se encuentra tu propia clase después de añadirla a
autoload. Ejecutacomposer dump-autoloady comprueba que la ruta del archivo coincide exactamente con el namespace, incluidas mayúsculas y minúsculas:App\Text\Slugdebe estar ensrc/Text/Slug.php, y los servidores Linux tratansrc/text/slug.phpcomo un archivo distinto. Your requirements could not be resolved to an installable set of packages. Dos paquetes necesitan versiones incompatibles de algo, a menudo del propio PHP. El mensaje enumera el conflicto;composer why-not vendor/package 2.0explica qué bloquea una versión.composerno se reconoce como comando. La terminal se abrió antes de la instalación, o la carpeta no está en tu PATH. Abre una terminal nueva, o llama directamente aphp composer.phar.
Preguntas frecuentes
¿Cuál es la diferencia entre composer install y composer update?
composer install instala exactamente las versiones registradas en composer.lock, así que todas las máquinas obtienen el mismo código; ejecútalo después de clonar y al desplegar. composer update resuelve las versiones más recientes que permite composer.json, las instala y reescribe composer.lock; ejecútalo cuando quieras actualizar.
¿Debo subir al repositorio composer.lock y la carpeta vendor?
Sube composer.lock en las aplicaciones, para que todo el mundo instale las mismas versiones. No subas vendor/: añádelo a .gitignore y deja que composer install lo vuelva a crear.
¿Qué significa ^ en composer.json?
^2.3 permite cualquier versión desde la 2.3.0 hasta la 3.0.0 sin incluirla: funciones nuevas y correcciones, pero ninguna versión mayor nueva que pueda romper tu código. ~2.3 significa lo mismo, y ~2.3.1 solo permite la 2.3.x a partir de la 2.3.1.
¿Cómo hago autoload de mis propias clases con Composer?
Añade "autoload": {"psr-4": {"App\\": "src/"}} a composer.json, ejecuta composer dump-autoload y haz require 'vendor/autoload.php'. Una clase App\Mail\Mailer se carga entonces desde src/Mail/Mailer.php la primera vez que la usas.
¿Cómo compruebo qué versión de Composer está instalada?
Ejecuta composer --version. Para actualizar el propio Composer, ejecuta composer self-update, o actualízalo con el gestor de paquetes con el que lo instalaste, como brew upgrade composer.