Composer est un outil qui permet de gérer les dépendances pour un projet PHP. Il permet d’ automatiser l’installation de modules ainsi que leurs mises à jour. il permet également de créer ses propres packages et de les distribuer. Cela peut être considéré comme un « apt » pour php. Nous allons voir comment installer cet outil et comment l’utiliser pour télécharger les modules dans un projet PHP.
L’environnement est le suivant :
- système Linux sous Ubuntu 20.4 ;
- apache installé ;
- php installé.
I Installation de « composer »
Pour installer composer :
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '906a84df04cea2aa72f40b5f787e49f22d4c2f19492ac310e8cba5b96ac8b64115ac402c8cd292b8a03482574915d1a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
Pour lancer composer en ligne de commande sans le préfixe php :
sudo mv composer.phar /usr/local/bin/composer
Pour vérifier l’installation :
composer
______
/ ____/___ ____ ___ ____ ____ ________ _____
/ / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
/_/
Composer version 2.1.9 2021-10-05 09:47:38
Usage:
command [options] [arguments]
Options:
...
Pour plus d’informations et obtenir la dernière version, aller sur le site officiel : lien
II Utilisation de « composer »
II.1 Initialisation du projet
Toutes les librairies sont inscrites dans un fichier qui se nomme « composer.json ». Il peut être créé à la main ce que nous ne ferons pas dans un premier temps.
Avant de lancer composer, nous allons créer une structure de travail qui sera la suivante !
test/
└── site
├── index.php
├── prive
└── public
Se placer à la racine de test en ligne de commande.
composer init
exemple de sortie :
Welcome to the Composer config generator
This command will guide you through creating your composer.json config.
Package name (<vendor>/<name>) [xavior/test_slim2]: union31/test
Description []: test de composer
Author [, n to skip]: Union31 <union31@union31.fr>
Minimum Stability []: stable
Package Type (e.g. library, project, metapackage, composer-plugin) []: project
License []:
Define your dependencies.
Would you like to define your dependencies (require) interactively [yes]? no
Would you like to define your dev dependencies (require-dev) interactively [yes]? no
Add PSR-4 autoload mapping? Maps namespace "Union31\Test" to the entered relative path. [src/, n to skip]:
{
"name": "union31/test",
"description": "test de composer",
"type": "project",
"autoload": {
"psr-4": {
"Union31\\Test\\": "src/"
}
},
"authors": [
{
"name": "Union31",
"email": "union31@union31.fr"
}
],
"minimum-stability": "stable",
"require": {}
}
Do you confirm generation [yes]?
Generating autoload files
Generated autoload files
PSR-4 autoloading configured. Use "namespace Union31\Test;" in src/
Include the Composer autoloader with: require 'vendor/autoload.php';
A ce stade le fichier composer.json est crée à la racine du projet. De plus les répertoires « src » et « vendor » ont été créés.
.
├── composer.json
├── site
│ ├── index.php
│ ├── prive
│ └── public
├── src
└── vendor
├── autoload.php
└── composer
├── autoload_classmap.php
├── autoload_namespaces.php
├── autoload_psr4.php
├── autoload_real.php
├── autoload_static.php
├── ClassLoader.php
└── LICENSE
Les modules seront stockés dans le répertoire « vendor ».
la composition du fichier composer.json ressemblera à ceci :
{
"name": "union31/test",
"description": "test de composer",
"type": "project",
"autoload": {
"psr-4": {
"Union31\\Test\\": "src/"
}
},
"authors": [
{
"name": "Union31",
"email": "union31@union31.fr"
}
],
"minimum-stability": "stable",
"require": {}
}
II.2 Première personnalisation
J’aimerais néanmoins que les modules se trouvent dans le répertoire vendor et non à la racine du site.
Pour cela, il faut modifier le fichier composer.json à la main et comme suivant :
{
"name": "union31/test",
"description": "test de composer",
"type": "project",
"autoload": {
"psr-4": {
"Union31\\Test\\": "site/"
}
},
"authors": [
{
"name": "Union31",
"email": "union31@union31.fr"
}
],
"minimum-stability": "stable",
"require": {},
"config": {
"vendor-dir": "./site/prive/vendor"
}
}
Ensuite mettre à jour composer :
composer update
Loading composer repositories with package information
Updating dependencies
Nothing to modify in lock file
Installing dependencies from lock file (including require-dev)
Nothing to install, update or remove
Generating autoload files
Ce qui donne la structure suivante :
.
├── composer.json
├── composer.lock
├── site
│ ├── index.php
│ ├── prive
│ │ └── vendor
│ │ ├── autoload.php
│ │ └── composer
│ │ ├── autoload_classmap.php
│ │ ├── autoload_namespaces.php
│ │ ├── autoload_psr4.php
│ │ ├── autoload_real.php
│ │ ├── autoload_static.php
│ │ ├── ClassLoader.php
│ │ ├── installed.json
│ │ ├── installed.php
│ │ ├── InstalledVersions.php
│ │ └── LICENSE
│ └── public
├── src
└── vendor
├── autoload.php
└── composer
├── autoload_classmap.php
├── autoload_namespaces.php
├── autoload_psr4.php
├── autoload_real.php
├── autoload_static.php
├── ClassLoader.php
└── LICENSE
Nous pouvons supprimer les répertoires /src et /vendor pour avoir au final ceci :
.
├── composer.json
├── composer.lock
└── site
├── index.php
├── prive
│ └── vendor
│ ├── autoload.php
│ └── composer
│ ├── autoload_classmap.php
│ ├── autoload_namespaces.php
│ ├── autoload_psr4.php
│ ├── autoload_real.php
│ ├── autoload_static.php
│ ├── ClassLoader.php
│ ├── installed.json
│ ├── installed.php
│ ├── InstalledVersions.php
│ └── LICENSE
└── public
II.3 Installation d’un module
Nous allons installer SLIM qui permet de gérer des routes HTML.
Pour cela il faut utiliser la commande « composer require le_nom_du_module » :
composer require slim/slim:"4.*"
Ce qui donne :
./composer.json has been updated
Running composer update slim/slim
Loading composer repositories with package information
Updating dependencies
Lock file operations: 8 installs, 0 updates, 0 removals
- Locking nikic/fast-route (v1.3.0)
- Locking psr/container (2.0.1)
- Locking psr/http-factory (1.0.1)
- Locking psr/http-message (1.0.1)
- Locking psr/http-server-handler (1.0.1)
- Locking psr/http-server-middleware (1.0.1)
- Locking psr/log (1.1.4)
- Locking slim/slim (4.9.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 8 installs, 0 updates, 0 removals
- Installing psr/log (1.1.4): Extracting archive
- Installing psr/http-message (1.0.1): Extracting archive
- Installing psr/http-server-handler (1.0.1): Extracting archive
- Installing psr/http-server-middleware (1.0.1): Extracting archive
- Installing psr/http-factory (1.0.1): Extracting archive
- Installing psr/container (2.0.1): Extracting archive
- Installing nikic/fast-route (v1.3.0): Extracting archive
- Installing slim/slim (4.9.0): Extracting archive
2 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
1 package you are using is looking for funding.
Use the `composer fund` command to find out more!
Et il faut également installer module suivant :
composer require slim/psr7
Nous avons maintenant la structure suivante :
.
└── site
├── prive
│ └── vendor
│ ├── composer
│ ├── fig
│ │ └── http-message-util
│ │ └── src
│ ├── nikic
│ │ └── fast-route
│ │ ├── src
│ │ │ ├── DataGenerator
│ │ │ ├── Dispatcher
│ │ │ └── RouteParser
│ │ └── test
│ │ ├── Dispatcher
│ │ ├── HackTypechecker
│ │ │ └── fixtures
│ │ └── RouteParser
│ ├── psr
│ │ ├── container
│ │ │ └── src
│ │ ├── http-factory
│ │ │ └── src
│ │ ├── http-message
│ │ │ └── src
│ │ ├── http-server-handler
│ │ │ └── src
│ │ ├── http-server-middleware
│ │ │ └── src
│ │ └── log
│ │ └── Psr
│ │ └── Log
│ │ └── Test
│ ├── ralouphie
│ │ └── getallheaders
│ │ └── src
│ ├── slim
│ │ ├── psr7
│ │ │ └── src
│ │ │ ├── Factory
│ │ │ └── Interfaces
│ │ └── slim
│ │ └── Slim
│ │ ├── Error
│ │ │ └── Renderers
│ │ ├── Exception
│ │ ├── Factory
│ │ │ └── Psr17
│ │ ├── Handlers
│ │ │ └── Strategies
│ │ ├── Interfaces
│ │ ├── Middleware
│ │ └── Routing
│ └── symfony
│ └── polyfill-php80
│ └── Resources
│ └── stubs
└── public
Un nouveau fichier à la racine a été crée automatiquement : « composer.lock » (a ne pas modifier manuellement). Dans le répertoire vendor il est apparu de nouveaux répertoires correpondants aux modules demandés et autres modules necessaires pour le bon fonction des premiers. Enfin, le fichier « composer.json » a été modifié et dont le contenu est maintenant le suivant :
{
"name": "union31/test",
"description": "test de composer",
"type": "project",
"autoload": {
"psr-4": {
"Union31\\Test\\": "site/"
}
},
"authors": [
{
"name": "Union31",
"email": "union31@union31.fr"
}
],
"minimum-stability": "stable",
"require": {
"slim/slim": "4.*",
"slim/psr7": "^1.5"
},
"config": {
"vendor-dir": "./site/prive/vendor"
}
}
Dans le fichier JSON nous voyons bien les 2 modules demandés.
II.4 Mise à jour, réinstallation, etc.
II.4.1 Installation des modules à partir d’un fichier composer.json existant
Dans la récupération de projets, et si composer est utilisé, générallement les sources des modules ne sont pas contenus dans le projet. Néanmoins le fichier composer.json existe et ce dernier indique quels modules sont nécessaires.
Nous allons donc se placer dans ce cas. Pour cela nous allons supprimer le répertoire vendor de la structure de fichiers :
rm -R ./site/prive/vendor
ce qui donne :
.
├── composer.json
├── composer.lock
└── site
├── index.php
├── prive
└── public
Pour installer les modules il faut indiquer la commande suivante :
composer install
ce qui donne :
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 12 installs, 0 updates, 0 removals
- Installing symfony/polyfill-php80 (v1.23.1): Extracting archive
- Installing ralouphie/getallheaders (3.0.3): Extracting archive
- Installing psr/http-message (1.0.1): Extracting archive
- Installing psr/http-factory (1.0.1): Extracting archive
- Installing fig/http-message-util (1.1.5): Extracting archive
- Installing slim/psr7 (1.5): Extracting archive
- Installing psr/log (1.1.4): Extracting archive
- Installing psr/http-server-handler (1.0.1): Extracting archive
- Installing psr/http-server-middleware (1.0.1): Extracting archive
- Installing psr/container (2.0.1): Extracting archive
- Installing nikic/fast-route (v1.3.0): Extracting archive
- Installing slim/slim (4.9.0): Extracting archive
Generating autoload files
2 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
Et la structure sera la suivante :
.
└── site
├── prive
│ └── vendor
│ ├── composer
│ ├── fig
│ │ └── http-message-util
│ │ └── src
│ ├── nikic
│ │ └── fast-route
│ │ ├── src
│ │ │ ├── DataGenerator
│ │ │ ├── Dispatcher
│ │ │ └── RouteParser
│ │ └── test
│ │ ├── Dispatcher
│ │ ├── HackTypechecker
│ │ │ └── fixtures
│ │ └── RouteParser
│ ├── psr
│ │ ├── container
│ │ │ └── src
│ │ ├── http-factory
│ │ │ └── src
│ │ ├── http-message
│ │ │ └── src
│ │ ├── http-server-handler
│ │ │ └── src
│ │ ├── http-server-middleware
│ │ │ └── src
│ │ └── log
│ │ └── Psr
│ │ └── Log
│ │ └── Test
│ ├── ralouphie
│ │ └── getallheaders
│ │ └── src
│ ├── slim
│ │ ├── psr7
│ │ │ └── src
│ │ │ ├── Factory
│ │ │ └── Interfaces
│ │ └── slim
│ │ └── Slim
│ │ ├── Error
│ │ │ └── Renderers
│ │ ├── Exception
│ │ ├── Factory
│ │ │ └── Psr17
│ │ ├── Handlers
│ │ │ └── Strategies
│ │ ├── Interfaces
│ │ ├── Middleware
│ │ └── Routing
│ └── symfony
│ └── polyfill-php80
│ └── Resources
│ └── stubs
└── public
II.4.2 Mise à jour des modules
Pour mettre à jour les modules il faut indiquer la commande suivante :
composer udpate
Ce qui donne :
Loading composer repositories with package information
Updating dependencies
Nothing to modify in lock file
Installing dependencies from lock file (including require-dev)
Nothing to install, update or remove
Generating autoload files
2 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
Dans notre cas il n’y a pas de mise à jour effectuée.
II.4.3 Trouver des modules
Il existe un entrepot dans lequel sont référencés tous les modules sur le site suivant : https://packagist.org/

Très utile pour trouver rapidement le bon « require » pour la bonne librairie…
II.4.4 Autres
Ne pas hésiter à aller sur le site officiel.
Une des pages interresante (parmi d’autres 🙂 ) concerne les commandes de composer : lien. On y trouvera notemment comment supprimer proprement un module et bien d’autes choses interessantes dans le cadre de l’automatisation de télécharemet des modules.
III Partie PHP
Nous allons voir maintenant comment utiliser ces modules dans PHP
III.1 Autoload
III.1.1 L’Autoload par défaut
Composer fournit un mecanisme de chargement automatique des modules.
Pour cela, dans le fichier index.php nous allons ajouter les lignes suivantes :
Cela aura pour effet de charger automatiquement les classes des modules lorsqu’elles seront utilisées.
<?php
# Charge l'autoloader de classes
require __DIR__ . '/prive/vendor/autoload.php';
?>
III.1.2 Charger ses propres classes
Pour charger ses propres classes et utiliser l’autoloader fourni par slim il faut l’indiquer dans le fichier « composer.json »
"autoload": {
"psr-4": {
"rappel_produit\\": "site/"
}
},
Cela aura pour effet d’aller chercher toutes les classes du répertoire site (et sous répertoires) pour le namespace « rappel_produit ».
Attention, cela utilise la norme « psr-4 ». Dans nore cas :
- les noms de fichiers commencent par une majuscule ;
- les sous namspaces suivent les noms de répertoires physiques ;
- les noms de classes ont une majuscule.
Pour plus d’info : https://www.php-fig.org/psr/psr-4/
III.2 Exemple d’utilisation avec module SLIM4
Le module SLIM4 permet de créer des applications web en utilisant le principe de REST. L’exemple ci-dessous intercepte une requête sur l’URL « / » et affiche un résultat.
<?php
# Charge l'autoloader de classes
require __DIR__ . '/prive/vendor/autoload.php';
# Déclaration des classes à utiliser
use Slim\Psr7\Request as Request;
use Slim\Psr7\Response as Response;
use Slim\Factory\AppFactory;
// Création de l'app
$app = AppFactory::create();
// défintion de la route
$app->get('/',function(Request $request, Response $response, $args){
// création de la réponse
$response->getBody()->write("Bonjour ! Test d'utilisation du module SLIM 4" );
// renvoie la réponse
return $response;
});
// On lance le tout ...
$app->run();
?>
On lance un serveur php pour ce site en particulier. Ceci à la racine de la structure en tapant la ligne de commande suivante :
php -S 127.0.0.1:8080 -t site
Puis on vérifie avec un navigateur :

Nous voyons que cela fonctionne.
Ceci pour dire que l’outil composer permet très rapidement de télécharger des modules déjà existant et de manière très simple au final.