Aller au contenu principal

Composer

Notions théoriques

Composer est un outil de gestion des dépendances pour PHP, qui permet aux développeurs d'automatiser le processus d'installation et de mise à jour des bibliothèques qu'ils utilisent dans leurs projets.

Composer permet d'installer et de gérer les bibliothèques dont votre projet a besoin, tout en évitant les conflits entre différentes versions de ces bibliothèques.

astuce

La traduction en anglais de 'bibliothèque' est 'library'.

Ne pas confondre avec la traduction en anglais de 'librairie' qui est 'bookstore'.

Composer permet donc de gérer les dépendances de vos projets PHP.

Installer Composer

Installer composer sous Windows

Voici les étapes pour installer la dernière version de Composer sous Windows :

  1. Téléchargez l'installateur Composer depuis le site officiel de Composer : https://getcomposer.org/download/.

  2. Exécutez l'installateur que vous venez de télécharger. Cela lancera l'assistant d'installation de Composer.

  3. Suivez les instructions de l'assistant d'installation. Vous pouvez généralement accepter les options par défaut, sauf si vous avez des besoins spécifiques.

  4. Lorsque l'installation est terminée, ouvrez une nouvelle fenêtre de terminal (Invite de commandes ou PowerShell).

  5. Pour vérifier que Composer est correctement installé, tapez la commande composer -v.

    Vous devriez voir la version de Composer s'afficher, ce qui confirme que l'installation s'est déroulée avec succès.

Installer composer sous Linux

Voici les étapes pour installer la dernière version de Composer sous Linux Debian :

  1. Ouvrez un terminal.

  2. Mettez à jour les packages de votre système en exécutant la commande suivante :

    sudo apt update
  3. Installez les dépendances nécessaires en exécutant la commande suivante :

    sudo apt install php php-cli php-zip unzip
  4. Téléchargez Composer en utilisant cURL en exécutant la commande suivante :

    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
  5. Vérifiez l'intégrité du téléchargement en exécutant la commande suivante :

    php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0d') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
  6. Installez Composer en exécutant la commande suivante :

    php composer-setup.php --install-dir=/usr/local/bin --filename=composer
  7. Pour vérifier que Composer est correctement installé, tapez la commande composer -v.

    Vous devriez voir la version de Composer s'afficher, ce qui confirme que l'installation s'est déroulée avec succès.

Le gestionnaire des bibliothèques PHP

Pour utiliser Composer, vous devez d'abord créer un fichier composer.json dans le répertoire racine de votre projet.

Le fichier composer.json contient une liste des dépendances de votre projet.

info

composer.json et composer.lock sont deux fichiers importants utilisés par Composer.

  1. composer.json : C'est le fichier principal que vous modifiez manuellement pour déclarer les dépendances de votre projet. Il contient des informations sur le projet et spécifie les dépendances requises, y compris leur version minimale acceptable. Par exemple, vous pouvez spécifier que votre projet nécessite la version 1.* de certaines bibliothèques.

  2. composer.lock : Ce fichier est généré (ou mis à jour) automatiquement lorsque vous exécutez composer update ou composer install sans avoir de fichier lock existant. Il contient des informations sur chaque paquet installé, y compris la version exacte qui a été installée. Cela signifie que si vous partagez votre projet avec quelqu'un d'autre et qu'il exécute composer install, il recevra exactement les mêmes versions de chaque paquet, indépendamment de leurs versions actuelles.

La principale différence est donc que composer.json est un document que vous modifiez pour déclarer ce dont votre projet a besoin, tandis que composer.lock est un document généré automatiquement qui enregistre exactement ce qui a été installé.

Cela permet une certaine flexibilité (vous pouvez accepter différentes versions d'un paquet selon les besoins de votre projet) tout en assurant la reproductibilité (tout le monde qui travaille sur le projet aura les mêmes versions des paquets, évitant ainsi les problèmes "ça marche sur ma machine").

Le répertoire central des bibliothèques PHP

Il existe un répertoire central de packages pour le langage de programmation PHP : https://packagist.org

astuce

Packagist.org fonctionne en tandem avec Composer.

Caractéristiques de Packagist.org :

  • Vaste Répertoire : Packagist.org offre un large éventail de packages PHP, couvrant une variété de fonctionnalités, allant des frameworks aux outils d'assistance au développement.

  • Intégration avec Composer : Les packages listés sur Packagist peuvent être facilement intégrés dans des projets PHP grâce à Composer, qui gère les versions et les dépendances de manière transparente.

  • Versioning Automatisé : Packagist travaille avec les systèmes de versioning comme Git, permettant aux développeurs de mettre à jour leurs packages automatiquement dès qu'une nouvelle version est publiée.

  • Recherche et Découverte : Le site propose des outils de recherche avancés pour aider les développeurs à trouver les packages dont ils ont besoin selon des critères spécifiques tels que la popularité, la maintenance ou la pertinence.

  • Facilité de Publication : Les développeurs peuvent soumettre leurs propres packages sur Packagist, les rendant ainsi accessibles à la communauté PHP mondiale.

Remarque

Packagist.org a favorisé une culture de réutilisation et d'optimisation de codes PHP, permettant aux développeurs de se concentrer sur la création de fonctionnalités uniques plutôt que de réinventer la roue.

Les fichiers composer.json et composer.lock

Composer utilise 2 fichiers : composer.json et composer.lock.

  • Le fichier composer.json est un fichier de configuration utilisé par Composer pour gérer les dépendances d'un projet PHP. Ce fichier définit les bibliothèques dont le projet a besoin et les versions appropriées, ainsi que d'autres paramètres liés à la gestion des packages.

    Exemple d'un fichier composer.json

    Voici un exemple simple de ce à quoi pourrait ressembler un fichier composer.json :

    {
    "name": "exemple/mon-projet",
    "description": "Une brève description du projet",
    "type": "project",
    "license": "MIT",
    "require": {
    "php": "^7.4 || ^8.0",
    "monolog/monolog": "^2.0",
    "guzzlehttp/guzzle": "^7.0.1"
    },
    "require-dev": {
    "phpunit/phpunit": "^9.3"
    },
    "autoload": {
    "psr-4": {
    "MonNamespace\\": "src/"
    }
    },
    "config": {
    "optimize-autoloader": true,
    "preferred-install": "dist",
    "platform": {
    "php": "7.4.3"
    }
    },
    "scripts": {
    "test": "phpunit --configuration phpunit.xml"
    },
    "extra": {
    "branch-alias": {
    "dev-master": "1.0.x-dev"
    }
    }
    }

    Le fichier composer.json est essentiel pour définir l'environnement de votre projet et garantir que tous les développeurs travaillant sur le projet utilisent les mêmes versions des bibliothèques. Quand vous exécutez des commandes comme composer install ou composer update, Composer lit ce fichier pour savoir quelles versions des bibliothèques doivent être installées ou mises à jour.

  • Le fichier composer.lock est généré par Composer et il contient des informations détaillées sur les versions exactes des packages installés, ainsi que les dépendances de ces packages pour un projet PHP donné. Ce fichier assure que le même environnement de dépendances est maintenu à travers différentes installations et environnements de développement.

    Exemple d'un fichier composer.lock

    Voici un exemple simplifié de ce à quoi pourrait ressembler un fichier composer.lock fichier :

    {
    "_readme": [
    "This file locks the dependencies of your project to a known state",
    "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
    "This file is @generated automatically"
    ],
    "content-hash": "b5656e4bce6a3d8113c832b0d4f04f45",
    "packages": [
    {
    "name": "monolog/monolog",
    "version": "2.0.0",
    "source": {
    "type": "git",
    "url": "https://github.com/Seldaek/monolog.git",
    "reference": "fe6f5ea6b0e3ad6ca6b49f7b7c2daa0d0b4e4b48"
    },
    "dist": {
    "type": "zip",
    "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fe6f5ea6b0e3ad6ca6b49f7b7c2daa0d0b4e4b48",
    "reference": "fe6f5ea6b0e3ad6ca6b49f7b7c2daa0d0b4e4b48",
    "shasum": ""
    },
    "require": {
    "php": "^7.2 || ^8.0",
    "psr/log": "^1.0.1"
    },
    "type": "library",
    "autoload": {
    "psr-4": {
    "Monolog\\": "src/Monolog"
    }
    },
    "notification-url": "https://packagist.org/downloads/",
    "license": ["MIT"],
    "authors": [
    {
    "name": "Jordi Boggiano",
    "email": "j.boggiano@seld.be"
    }
    ],
    "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
    "homepage": "http://github.com/Seldaek/monolog",
    "keywords": ["log", "logging", "psr-3"]
    }
    // ... more packages
    ],
    "packages-dev": [
    // ... dev packages
    ],
    "aliases": [],
    "minimum-stability": "stable",
    "stability-flags": [],
    "prefer-stable": true,
    "prefer-lowest": false,
    "platform": {
    "php": "7.4.3"
    },
    "platform-dev": [],
    "plugin-api-version": "2.0.0"
    }

    Cet exemple montre un seul package (monolog/monolog) verrouillé à une version spécifique avec une référence précise au commit dans le dépôt Git correspondant.

Installation d'une bibliothèque

Afin de tester l'installation d'une dépendance, nous allons utiliser la bibliothèque Monolog.

Monolog est une bibliothèque PHP qui permet de gérer les logs de votre application.

Niveaux de log d'une application
  • DEBUG : Informations détaillées sur le flux de l'application qui sont utiles pour déboguer.
  • INFO : Événements intéressants comme l'utilisateur se connectant, SQL logs.
  • NOTICE : Événements normaux mais significatifs.
  • WARNING : Événements exceptionnels qui ne sont pas des erreurs. Utilisez le niveau WARNING lorsque l'erreur est imminente.
  • ERROR : Les erreurs d'exécution qui n'obligent pas immédiatement à arrêter le script. Utilisez le niveau ERROR pour enregistrer les exceptions qui sont gérées.
  • CRITICAL : Conditions dangereuses. Exemple : composant de l'application indisponible, exception inattendue.
  • ALERT : Action doit être prise immédiatement. Exemple : site Web down, base de données indisponible, etc. Ce sont les cas où vous devriez envoyer des SMS aux personnes qui peuvent résoudre le problème.
  • EMERGENCY : Système hors service.

La bibliothèque PHP Monolog peut être installée via Composer https://packagist.org/packages/monolog/monolog.

Voyons comment faire, pour installer la bibliothèque Monolog, dans cet exemple pratique.

Exemple pratique

  1. Initialisation du projet avec Composer

    La première étape consiste à initialiser votre projet avec Composer. Ouvrez une invite de commande, naviguez vers le répertoire de votre projet et tapez la commande suivante :

    composer init

    Cette commande initialise un nouveau projet Composer. Elle vous guidera à travers la création d'un fichier composer.json, qui est utilisé par Composer pour gérer les dépendances de votre projet. Vous pouvez simplement appuyer sur Entrée pour accepter les valeurs par défaut pour la plupart des questions.

    Package name : VOTRE-NOM/composer-tp
    Description : Small project to learn the composer tool
    Author : VOTRE-NOM <VOTRE-ADRESSE-EMAIL>
    Minimum Stability : stable
    Package Type : project
    License : MIT
    Would you like to define your dependencies : no
    Would you like to define your dev dependencies : no
    Do you confirm generation : yes
  2. Ajout de Monolog comme dépendance

    Nous allons ajouter Monolog comme dépendance de notre projet.

    Dans le même répertoire que le fichier composer.json, tapez la commande suivante :

    composer require monolog/monolog

    Cette commande met à jour le fichier composer.json pour inclure Monolog comme dépendance et télécharge la bibliothèque Monolog dans le répertoire vendor.

  3. Installation des dépendances avec Composer

    Si vous avez récupéré un projet existant ou si vous avez ajouté manuellement une dépendance dans votre fichier composer.json, vous devez exécuter la commande suivante pour installer les dépendances :

    composer install

    Cette commande lit le fichier composer.json, télécharge toutes les dépendances requises et les installe dans le répertoire vendor. Si les dépendances sont déjà installées, cette commande vérifie si des mises à jour sont disponibles et les installe si nécessaire.

  4. Utilisation de Monolog dans votre projet

    Maintenant que Monolog est installé, vous pouvez l'utiliser dans votre projet. Ajoutez ce code au début de votre script PHP :

    require 'vendor/autoload.php';

    use Monolog\Logger;
    use Monolog\Handler\StreamHandler;

    // Créez un journal des logs
    $log = new Logger('nom-du-journal'); // Par exemple 'game'

    // Ajoutez un handler qui écrit tous les messages dans jeu-combat.log
    $log->pushHandler(new StreamHandler('chemin/jeu-combat.log', Logger::WARNING));

    // Exemple d'ajout d'une ligne dans le fichier .log
    $log->info("L'utilisateur s'est connecté avec son identifiant et son mot de passe);

    // Exemple d'ajout d'une ligne dans le fichier .log
    $log->error("Impossible de se connecter à la base de données");

    Le premier appel à require inclut le chargeur automatique généré par Composer, qui se charge d'inclure les fichiers nécessaires pour utiliser Monolog.

    Ensuite, nous créons un nouvel objet Logger et lui ajoutons un StreamHandler qui écrit les messages de niveau WARNING et supérieur dans le fichier jeu-combat.log.

    Enfin, nous ajoutons quelques messages au log pour tester notre configuration.

Voilà, vous avez maintenant un projet PHP qui utilise Composer pour gérer ses dépendances et qui utilise Monolog pour le logging !


Quand utiliser la commande composer install ou composer update ?

composer install et composer update sont 2 commandes de Composer qui sont utilisées pour gérer les dépendances dans un projet PHP, mais elles ont des objectifs différents :

  1. composer install :

    • Cette commande est utilisée pour installer les dépendances d'un projet en se basant sur le fichier composer.lock, qui est un instantané des versions exactes de toutes les dépendances installées la dernière fois que composer update a été exécuté.
    • Si le fichier composer.lock n'existe pas, composer install se basera sur le fichier composer.json pour installer les dernières versions des dépendances qui respectent les contraintes de version spécifiées.
    • L'objectif principal de composer install est de garantir que le même ensemble de dépendances est installé quel que soit l'environnement dans lequel le projet est déployé (développement, test, production, etc.).
  2. composer update :

    • Cette commande est utilisée pour mettre à jour les dépendances d'un projet aux dernières versions qui respectent les contraintes définies dans composer.json.
    • Lors de l'exécution de composer update, Composer va rechercher les dernières versions des paquets disponibles, mettre à jour le fichier composer.lock avec les nouvelles versions, et ensuite installer ces mises à jour.
    • Il est important de noter que composer update peut potentiellement introduire des changements incompatibles si les contraintes de version dans composer.json ne sont pas définies de manière précise.

En résumé, utilisez composer install pour installer ou réinstaller les dépendances en vous assurant que vous utilisez les versions spécifiées dans composer.lock.

Cela est particulièrement important pour maintenir la cohérence des environnements et éviter les problèmes liés à des mises à jour inattendues des dépendances.

Utilisez composer update lorsque vous souhaitez actualiser les versions des dépendances en fonction des contraintes de version définies dans composer.json. Cela devrait être fait prudemment, idéalement en environnement de développement, pour s'assurer que les nouvelles versions des dépendances ne cassent pas le projet.

Pourquoi utiliser Composer plutôt que include ou require ?

Pourquoi est-il conseillé d'utiliser l'autoloader généré par Composer plutôt que l'utilisation des instructions include ou require ?

Composer est un outil de gestion des dépendances pour PHP qui automatise le processus d'inclusion des bibliothèques et des classes. Voici plusieurs raisons pour lesquelles il est conseillé d'utiliser l'autoloader généré par Composer plutôt que les instructions include ou require manuelles :

  1. Gestion automatique des dépendances : Composer télécharge et installe automatiquement toutes les bibliothèques nécessaires pour un projet, ainsi que leurs dépendances, en se basant sur le fichier composer.json. Cela simplifie grandement la gestion des bibliothèques tierces.

  2. Autoloading PSR-4 et PSR-0 : Composer implémente les standards PSR-4 et PSR-0 pour l'autoloading, qui sont des conventions de nommage permettant de charger les fichiers de classes de manière standardisée. Cela signifie que vous n'avez pas besoin d'écrire des instructions include ou require pour chaque classe ; l'autoloader de Composer s'en charge pour vous.

  3. Performance : L'autoloader de Composer est optimisé pour la performance. Il génère une carte de toutes les classes et de leurs chemins de fichiers, ce qui permet de charger les fichiers de manière plus efficace. De plus, il offre la possibilité de générer un autoloader optimisé avec la commande composer dump-autoload --optimize, qui peut améliorer encore plus les performances.

  4. Maintenance et lisibilité : L'utilisation de l'autoloader de Composer réduit le besoin de gérer manuellement les inclusions de fichiers, ce qui rend le code plus propre, plus lisible et plus facile à maintenir.

  5. Compatibilité et interopérabilité : En utilisant Composer et les standards PSR pour l'autoloading, votre projet sera plus compatible avec d'autres projets et bibliothèques qui suivent les mêmes standards. Cela facilite l'intégration et le partage de code entre différents projets PHP.

  6. Gestion des conflits de versions : Composer gère les versions des bibliothèques et s'assure que les versions compatibles sont utilisées ensemble. Cela évite les conflits qui peuvent survenir lorsque plusieurs versions d'une même bibliothèque sont incluses manuellement.

  7. Facilité de mise à jour : Avec Composer, mettre à jour les bibliothèques tierces est aussi simple que d'exécuter composer update. Cela vérifie les dernières versions disponibles en fonction des contraintes définies dans composer.json et met à jour les bibliothèques en conséquence.

En résumé, l'utilisation de l'autoloader de Composer au lieu des include ou require manuels permet de simplifier et d'automatiser la gestion des dépendances, d'améliorer la performance, de maintenir le code propre et de faciliter la maintenance et les mises à jour des bibliothèques tierces.


Test de mémorisation/compréhension


Qu'est-ce que Composer ?


Comment utilise-t-on une bibliothèque installée via Composer ?


À quoi sert Monolog ?


Dans quel répertoire Composer installe-t-il les bibliothèques ?


Où doit se trouver le fichier composer.json ?


Quel fichier est modifié manuellement pour déclarer les dépendances d'un projet PHP ?


Quel fichier est généré automatiquement lors de l'exécution de 'composer update' ?


Lequel de ces fichiers enregistre la version exacte des paquets installés ?


Lequel de ces fichiers assure la reproductibilité des versions de paquets entre différents environnements de développement ?


Lequel de ces fichiers permet de spécifier une plage de versions acceptables pour une dépendance ?


Quel est le principal rôle de Packagist.org dans l'écosystème PHP ?


Quel outil est utilisé en tandem avec Packagist.org pour la gestion des dépendances ?


Quelle est la facilité offerte par Packagist.org pour les développeurs de packages ?


Quelle est la principale conséquence de l'existence de Packagist.org pour les développeurs PHP ?


À quoi sert principalement Composer en relation avec Packagist.org ?


Quel est le niveau de log le plus bas dans la plupart des systèmes de logging ?


Quel niveau de log est généralement utilisé pour les informations qui sont utiles en production pour le diagnostic et le suivi ?


Quel niveau de log est généralement utilisé pour signaler une situation qui pourrait potentiellement causer un problème ?


Quel niveau de log est généralement utilisé pour les situations où l'application ne peut pas continuer à fonctionner ?


Quel niveau de log est généralement utilisé pour les erreurs qui peuvent encore permettre à l'application de continuer à fonctionner ?



TP pour réfléchir et résoudre des problèmes

Pour ce TP, vous allez intégrer Monolog à notre jeu de combat.

L'idée est de logger chaque action effectuée dans le jeu : attaque réussie, attaque manquée, points de vie restants, etc.

Consignes

  1. Dans votre répertoire "Documents" créez le répertoire tp_-composer.

  2. Dans ce répertoire créez le fichier main.php :

    <?php
    // Premiers pas avec Composer
    print("Premiers pas avec Composer \n\n");
  3. Testez le fonctionnement de ce fichier :

    php main.php
  4. Ensuite initialisez Composer dans votre projet, avec la commande :

    composer init
  5. Suivez les instructions à l'écran pour configurer votre fichier composer.json.

  6. Installez ensuite la bibliothèque Monolog monolog/monolog.

  7. Complétez votre fichier main.php pour :

    • inclure l'autoloader de Composer,
    • créer un nouveau canal de log pour le jeu

      fichier de log : game.log et niveau de log : DEBUG,

    • écrire dans le journal game.log, au niveau INFO : 'Le jeu démarre.',
    • écrire dans le journal game.log, au niveau DEBUG : 'Le joueur attaque le monstre.',
    • et afficher à l'écran : "Veuillez consulter le fichier game.log".

Corigé

Une solution
astuce

N'oubliez pas, la pratique est la clé pour maîtriser une nouvelle compétence. Donc, si vous n'avez pas réussi du premier coup, ne vous découragez pas et essayez à nouveau.