Utilisation de Composer et autoloading

Maîtrisez la gestion des dépendances avec Composer, implémentez l'autoloading PSR-4 et apprenez à créer et distribuer vos propres packages PHP.

Introduction à Composer

Composer est un gestionnaire de dépendances pour PHP qui permet d'installer et de gérer facilement les bibliothèques dont votre projet a besoin. Il est devenu un outil essentiel dans l'écosystème PHP moderne.

Qu'est-ce que Composer ?

Composer résout plusieurs problèmes courants en développement PHP :

  • Gestion des dépendances : Téléchargement et mise à jour automatique des bibliothèques
  • Résolution de versions : Gestion des contraintes de compatibilité entre packages
  • Autoloading : Chargement automatique des classes sans require/include manuels
  • Standardisation : Normalisation de la structure des projets PHP

Installation de Composer

Installation sous Windows
  1. Téléchargez l'installateur depuis getcomposer.org
  2. Exécutez l'installateur et suivez les instructions
  3. Vérifiez l'installation avec la commande :
composer --version
Installation sous Linux/macOS

Installation via la ligne de commande :

# Téléchargement du programme d'installation
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

# Vérification du hachage SHA-384 (optionnel mais recommandé)
php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

# Installation
php composer-setup.php

# Nettoyage
php -r "unlink('composer-setup.php');"

# Installation globale (optionnel)
sudo mv composer.phar /usr/local/bin/composer

# Vérification
composer --version

Structure de base d'un projet Composer

Fichier composer.json

Le fichier composer.json est au cœur de chaque projet utilisant Composer. Il définit les métadonnées et les dépendances du projet.

{
    "name": "mon-vendor/mon-projet",
    "description": "Une description de mon projet",
    "type": "project",
    "license": "MIT",
    "authors": [
        {
            "name": "Votre Nom",
            "email": "votre.email@exemple.com"
        }
    ],
    "minimum-stability": "stable",    "require": {
        "php": ">=7.4",
        "monolog/monolog": "^2.3",
        "symfony/http-foundation": "^5.3"
    },
    "require-dev": {
        "phpunit/phpunit": "^9.5",
        "friendsofphp/php-cs-fixer": "^3.0"
    },
    "autoload": {
        "psr-4": {
            "MonNamespace\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "MonNamespace\\Tests\\": "tests/"
        }
    },
    "scripts": {
        "test": "phpunit",
        "cs-fix": "php-cs-fixer fix"
    }
}

Explications des sections principales :

  • require : Dépendances nécessaires pour l'environnement de production
  • require-dev : Dépendances nécessaires uniquement pour le développement
  • autoload : Configuration du chargement automatique des classes
  • scripts : Commandes personnalisées exécutables via Composer

Installation et gestion des packages

Commandes de base de Composer

Installer des dépendances
# Initialiser un nouveau projet
composer init

# Installer toutes les dépendances du projet
composer install

# Installer avec optimisation pour la production
composer install --no-dev --optimize-autoloader

# Ajouter une nouvelle dépendance
composer require monolog/monolog

# Ajouter une dépendance de développement
composer require --dev phpunit/phpunit

# Spécifier une version précise
composer require twig/twig:^3.0

# Mettre à jour toutes les dépendances
composer update

# Mettre à jour une dépendance spécifique
composer update monolog/monolog

# Supprimer une dépendance
composer remove symfony/yaml
Gestion des versions

Composer utilise le versionnement sémantique (SemVer) pour les contraintes de versions.

Contrainte Signification Exemple
1.2.3 Version exacte Seule la version 1.2.3
>=1.2.3 Version minimale 1.2.3 ou plus récent
>1.2.3 Version strictement supérieure 1.2.4 ou plus récent
^1.2.3 Compatible avec les versions 1.x ≥ 1.2.3 et < 2.0.0
~1.2.3 Compatible avec les versions de correctifs ≥ 1.2.3 et < 1.3.0
1.2.* Joker ≥ 1.2.0 et < 1.3.0
1.2.3 || 1.3.0 OU logique Soit 1.2.3, soit 1.3.0

Recommandation : Utilisez ^ pour la plupart des dépendances afin de bénéficier automatiquement des correctifs de bugs tout en évitant les changements incompatibles.

Composer.lock et stabilité du projet

Importance du fichier composer.lock

Le fichier composer.lock est automatiquement généré lors de l'installation ou de la mise à jour des dépendances. Il enregistre les versions exactes installées de chaque package.

Important
  • Toujours commiter composer.lock dans votre dépôt Git pour les projets d'application
  • Ne pas commiter composer.lock pour les bibliothèques/packages

Avantages du fichier lock :

  • Reproductibilité : Garantit que tous les environnements utilisent exactement les mêmes versions
  • Stabilité : Évite les surprises lors des déploiements
  • Performance : Installation plus rapide car les versions sont déjà déterminées
# Installer à partir du composer.lock (recommandé pour les déploiements)
composer install

# Mettre à jour le composer.lock avec les dernières versions compatibles
composer update

Packages populaires et utilitaires Composer

Packages PHP populaires
  • monolog/monolog - Système de journalisation
  • guzzlehttp/guzzle - Client HTTP
  • symfony/http-foundation - Composants web fondamentaux
  • twig/twig - Moteur de templates
  • doctrine/orm - ORM pour bases de données
  • phpunit/phpunit - Framework de test
  • ramsey/uuid - Génération d'identifiants uniques
  • nesbot/carbon - Manipulation des dates
  • vlucas/phpdotenv - Chargement de variables d'environnement
  • league/flysystem - Abstraction du système de fichiers

Explorez plus de packages sur Packagist.org, le dépôt principal de Composer.

Utilitaires Composer utiles
# Afficher les informations sur les packages installés
composer show

# Afficher les détails d'un package spécifique
composer show monolog/monolog

# Vérifier les mises à jour disponibles
composer outdated

# Vérifier les problèmes de sécurité dans les dépendances
composer audit

# Valider la configuration composer.json
composer validate

# Nettoyer le cache Composer
composer clear-cache

# Créer un projet à partir d'un squelette
composer create-project laravel/laravel mon-projet

# Exécuter un script défini dans composer.json
composer run-script test

Utilisez composer help pour voir toutes les commandes disponibles.

Autoloading avec Composer

L'autoloading est l'une des fonctionnalités les plus puissantes de Composer : elle permet de charger automatiquement les classes PHP sans avoir à utiliser manuellement les instructions require ou include.

Types d'autoloading

PSR-4 (Recommandé)

PSR-4 est la norme d'autoloading moderne qui permet de faire correspondre les espaces de noms avec les répertoires.

Configuration dans composer.json :

{
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}

Structure de répertoires :

projet/
├── composer.json
├── src/
│   ├── Controller/
│   │   └── UserController.php
│   └── Model/
│       └── User.php

Dans src/Controller/UserController.php :

namespace App\Controller;

use App\Model\User;

class UserController
{
    public function show($id)
    {
        $user = new User($id);
        return $user->getData();
    }
}

Avec PSR-4, App\Controller\UserController est automatiquement résolu en src/Controller/UserController.php.

Autres types d'autoloading

PSR-0 (Déprécié)

{
    "autoload": {
        "psr-0": {
            "App\\": "src/"
        }
    }
}

Différence principale avec PSR-4 : PSR-0 convertit les underscores dans les noms de classes en séparateurs de répertoire.

Classmap

{
    "autoload": {
        "classmap": ["src/", "lib/"]
    }
}

Scanne les répertoires spécifiés et génère une correspondance statique entre chaque classe trouvée et son emplacement de fichier.

Files

{
    "autoload": {
        "files": ["src/helpers.php", "src/functions.php"]
    }
}

Inclut des fichiers spécifiques dans chaque requête, utile pour les fichiers de fonctions globales.

Après modification de la configuration d'autoloading :

# Régénérer les fichiers d'autoloading
composer dump-autoload

# Optimiser pour la production
composer dump-autoload --optimize

PSR-4 en détail

Convention de nommage PSR-4

Le standard PSR-4 définit les règles suivantes :

  • Les noms complets des classes doivent suivre le format : <NamespacePrefix>\<SubNamespaces>\<ClassName>
  • Chaque namespace est mappé à un répertoire
  • Chaque séparateur de namespace \ correspond à un séparateur de répertoire /
  • Les noms de classes doivent correspondre exactement aux noms de fichiers (sensibles à la casse)

Exemple avancé de mappings multiples :

{
    "autoload": {
        "psr-4": {
            "App\\": "src/",
            "App\\Plugins\\": "plugins/",
            "Acme\\Tools\\": "vendor-local/acme/tools-package/src"
        }
    }
}
Bonnes pratiques
  • Utilisez des namespaces uniques pour éviter les conflits avec d'autres bibliothèques
  • Préfixez vos namespaces avec un identifiant de votre organisation/projet
  • Maintenez une structure de répertoires claire qui reflète la hiérarchie des namespaces
  • Utilisez StudlyCaps pour les noms de classes (première lettre en majuscule)
  • Placez une seule classe par fichier

Utilisation de l'autoloader

Inclusion de l'autoloader

Pour utiliser l'autoloading dans vos scripts, incluez le fichier vendor/autoload.php généré par Composer :

require_once 'vendor/autoload.php';

// Maintenant, vous pouvez utiliser vos classes sans require/include
$logger = new Monolog\Logger('app');
$user = new App\Model\User(1);

Dans un projet structuré, cela se fait généralement dans un point d'entrée unique :

// public/index.php
define('ROOT_DIR', dirname(dirname(__FILE__)));

require_once ROOT_DIR . '/vendor/autoload.php';

// Code de démarrage de l'application
$app = new App\Application();
$app->run();
Optimisation de l'autoloading

En production, optimisez l'autoloading pour de meilleures performances :

# Génère un fichier de class map qui accélère la résolution des classes
composer dump-autoload --optimize --no-dev

Comparaison des différentes options :

Option Description Utilisation
--optimize ou -o Convertit PSR-0/PSR-4 en classmap Production
--classmap-authoritative ou -a Utilise uniquement le classmap (plus strict) Production critique
--apcu Utilise APCu pour mettre en cache les classmap Production avec APCu
--no-dev Exclut les dépendances de développement Production

Créer et publier son propre package

Comparaison des différentes options :

Option Description Utilisation
--optimize ou -o Convertit PSR-0/PSR-4 en classmap Production
--classmap-authoritative ou -a Utilise uniquement le classmap (plus strict) Production critique
--apcu Utilise APCu pour mettre en cache les classmap Production avec APCu
--no-dev Exclut les dépendances de développement Production

Créer et publier son propre package

Vous pouvez créer et publier vos propres packages PHP pour les réutiliser dans vos projets ou les partager avec la communauté.

Structure d'un package PHP

Organisation des fichiers
mon-package/
├── composer.json
├── LICENSE
├── README.md
├── .gitignore
├── phpunit.xml.dist
├── src/
│   └── ...
├── tests/
│   └── ...
└── docs/
    └── ...

Exemple de composer.json pour un package :

{
    "name": "mon-vendor/mon-package",
    "description": "Description de mon package",
    "type": "library",
    "license": "MIT",
    "authors": [
        {
            "name": "Votre Nom",
            "email": "email@exemple.com"
        }
    ],
    "require": {
        "php": ">=7.4"
    },
    "require-dev": {
        "phpunit/phpunit": "^9.5"
    },
    "autoload": {
        "psr-4": {
            "MonVendor\\MonPackage\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "MonVendor\\MonPackage\\Tests\\": "tests/"
        }
    },
    "minimum-stability": "stable",
    "prefer-stable": true
}

Important : Le nom du package doit suivre le format vendor/name où :

  • vendor est votre nom d'organisation ou nom d'utilisateur (sans majuscules ni caractères spéciaux)
  • name est le nom du package (généralement en minuscule avec des tirets)

Développement et test de packages

Développer votre package

Exemple de classe dans src/Calculator.php :

namespace MonVendor\MonPackage;

class Calculator
{
    /**
     * Additionne deux nombres.
     *
     * @param float $a Premier nombre
     * @param float $b Second nombre
     * @return float La somme des deux nombres
     */
    public function add($a, $b)
    {
        return $a + $b;
    }
    
    /**
     * Soustrait le second nombre du premier.
     *
     * @param float $a Premier nombre
     * @param float $b Second nombre
     * @return float La différence entre les deux nombres
     */
    public function subtract($a, $b)
    {
        return $a - $b;
    }
}

Test unitaire correspondant dans tests/CalculatorTest.php :

namespace MonVendor\MonPackage\Tests;

use MonVendor\MonPackage\Calculator;
use PHPUnit\Framework\TestCase;

class CalculatorTest extends TestCase
{
    public function testAdd()
    {
        $calculator = new Calculator();
        $result = $calculator->add(5, 3);
        $this->assertEquals(8, $result);
    }

    public function testSubtract()
    {
        $calculator = new Calculator();
        $result = $calculator->subtract(5, 3);
        $this->assertEquals(2, $result);
    }
}

Configuration PHPUnit dans phpunit.xml.dist :

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.5/phpunit.xsd"
         bootstrap="vendor/autoload.php"
         colors="true">
    <testsuites>
        <testsuite name="MonPackage Test Suite">
            <directory>tests</directory>
        </testsuite>
    </testsuites>
    <coverage>
        <include>
            <directory suffix=".php">src</directory>
        </include>
    </coverage>
</phpunit>

Explications des éléments clés :

  • bootstrap : Fichier d'amorçage (généralement l'autoloader de Composer)
  • testsuites : Organisation des suites de tests
  • coverage : Configuration pour l'analyse de couverture de code
  • colors : Affichage des résultats avec couleurs dans le terminal