Menu

Composer PHP : installer des paquets, autoload des classes

Composer est le gestionnaire de paquets de PHP : composer require vendor/package télécharge une bibliothèque dans vendor/, l'enregistre dans composer.json, et require 'vendor/autoload.php' la charge. Installer Composer, composer.json, contraintes de version, install ou update, et l'autoloading PSR-4 de vos propres classes.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Composer est le gestionnaire de paquets de PHP. Lancez composer require vendor/package dans le dossier de votre projet : Composer télécharge la bibliothèque dans vendor/, l'enregistre dans composer.json, et vous la chargez, avec tout ce que vous avez installé, en une ligne, 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%']);

Pas d'include pour chaque fichier : l'autoloader charge Logger, StreamHandler et tout ce qu'ils utilisent la première fois que chaque classe est nécessaire. Les paquets viennent de Packagist, le registre public que Composer consulte par défaut.

Installer Composer

Composer a d'abord besoin de PHP sur votre machine (voir installer PHP).

Windows : téléchargez et lancez Composer-Setup.exe depuis getcomposer.org. Il trouve votre php.exe et ajoute composer au PATH. Ouvrez ensuite un nouveau terminal.

macOS avec Homebrew :

brew install composer

Linux : le paquet de votre distribution (sudo apt install composer sur Debian et Ubuntu) fonctionne mais est souvent une version plus ancienne. L'installateur officiel donne la version actuelle :

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 page de téléchargement de getcomposer.org montre aussi une ligne qui vérifie le hash de l'installateur avant de l'exécuter ; copiez les commandes depuis cette page pour avoir le hash actuel. Vérifiez ensuite que tout fonctionne :

composer --version

composer.json et composer.lock

composer init pose quelques questions et écrit composer.json, ou composer require le crée au premier paquet. Un exemple typique :

{
    "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/"
        }
    }
}
  • require liste ce dont le projet a besoin pour s'exécuter, y compris la version de PHP.
  • require-dev liste les outils réservés au développement (tests, analyse statique). composer require --dev phpunit/phpunit y ajoute un paquet, et composer install --no-dev les ignore sur les serveurs de production.
  • autoload indique à Composer où vivent vos propres classes (voir plus bas).

À côté, Composer écrit composer.lock avec la version exacte de chaque paquet installé, y compris les paquets dont dépendent vos paquets. Committez les deux fichiers. Ne committez pas vendor/ : ajoutez-le à .gitignore, car composer install le reconstruit à partir du fichier lock.

composer install ou 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

Lancez composer install après avoir cloné un projet et à chaque déploiement : tout le monde reçoit les mêmes versions, celles qui ont été testées. Lancez composer update seulement quand vous voulez mettre à jour, puis testez et committez le nouveau composer.lock. Lancer update sur un serveur de production installe des versions que personne n'a testées.

Contraintes de version : ^ et ~

ContrainteAutoriseÀ utiliser pour
^3.23.2.0 jusqu'à 4.0.0 excluLe choix normal : fonctions et corrections, pas de version majeure cassante
^0.40.4.0 jusqu'à 0.5.0 excluLes paquets avant 1.0, où les versions mineures peuvent casser
~3.23.2.0 jusqu'à 4.0.0 excluIdentique à ^3.2
~3.2.13.2.1 jusqu'à 3.3.0 excluCorrections seulement
3.2.1Exactement 3.2.1Rarement ; cela bloque les correctifs de sécurité
>=3.2 <3.5Une plage personnaliséeContourner une version défectueuse

composer require vendor/package sans version choisit la dernière version stable et écrit une contrainte ^ pour elle, ce qui est en général ce que vous voulez.

Autoloader vos propres classes avec PSR-4

PSR-4 est la convention qui associe un namespace à un dossier : avec "App\\": "src/", la classe App\Text\Slug se trouve dans src/Text/Slug.php. Après avoir ajouté la section autoload, lancez :

composer dump-autoload

L'autoloader de Composer est une fonction enregistrée avec spl_autoload_register(), que PHP appelle chaque fois que le code utilise une classe pas encore chargée. Ce bloc écrit deux fichiers de classes et enregistre son propre petit autoloader PSR-4, pour que vous voyiez la correspondance fonctionner. Ajoutez un troisième fichier de classe et utilisez-le.

L'autoloader s'exécute une fois par classe : le second appel à Slug::from() n'affiche aucune ligne autoload:, car la classe est déjà chargée. Dans un vrai projet, vous n'écrivez jamais cette fonction vous-même ; vendor/autoload.php enregistre la version de Composer, qui gère aussi les paquets de vendor/. Les namespaces sont présentés sur la page des namespaces.

Erreurs fréquentes

  • Class "Monolog\Logger" not found. Le script n'a pas fait require 'vendor/autoload.php', ou le chemin est faux. Utilisez __DIR__ . '/vendor/autoload.php' pour que le chemin ne dépende pas du dossier courant.
  • Votre propre classe est introuvable après l'avoir ajoutée à autoload. Lancez composer dump-autoload, et vérifiez que le chemin du fichier correspond exactement au namespace, majuscules et minuscules comprises : App\Text\Slug doit être src/Text/Slug.php, et les serveurs Linux traitent src/text/slug.php comme un fichier différent.
  • Your requirements could not be resolved to an installable set of packages. Deux paquets demandent des versions incompatibles de quelque chose, souvent de PHP lui-même. Le message liste le conflit ; composer why-not vendor/package 2.0 explique ce qui bloque une version.
  • composer n'est pas reconnu. Le terminal a été ouvert avant l'installation, ou le dossier n'est pas dans votre PATH. Ouvrez un nouveau terminal, ou appelez directement php composer.phar.

Questions fréquentes

Quelle est la différence entre composer install et composer update ?

composer install installe exactement les versions enregistrées dans composer.lock, si bien que chaque machine reçoit le même code ; lancez-le après un clone et au déploiement. composer update résout les versions les plus récentes autorisées par composer.json, les installe et réécrit composer.lock ; lancez-le quand vous voulez mettre à jour.

Faut-il committer composer.lock et le dossier vendor ?

Committez composer.lock pour les applications, afin que tout le monde installe les mêmes versions. Ne committez pas vendor/ : ajoutez-le à .gitignore et laissez composer install le recréer.

Que signifie ^ dans composer.json ?

^2.3 autorise toute version de 2.3.0 jusqu'à 3.0.0 exclu : nouvelles fonctions et corrections, mais pas de nouvelle version majeure qui pourrait casser votre code. ~2.3 signifie la même chose, et ~2.3.1 n'autorise que les 2.3.x à partir de 2.3.1.

Comment autoloader mes propres classes avec Composer ?

Ajoutez "autoload": {"psr-4": {"App\\": "src/"}} à composer.json, lancez composer dump-autoload, et faites require 'vendor/autoload.php'. Une classe App\Mail\Mailer est alors chargée depuis src/Mail/Mailer.php la première fois que vous l'utilisez.

Comment savoir quelle version de Composer est installée ?

Lancez composer --version. Pour mettre à jour Composer lui-même, lancez composer self-update, ou passez par le gestionnaire de paquets avec lequel vous l'avez installé, comme brew upgrade composer.

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

COMMENCER