Composer est un gestionnaire de dépendances open source écrit en PHP. Il permet à ses utilisateurs de déclarer et d’installer les bibliothèques dont le projet principal a besoin. Le développement a débuté en avril 2011 et a donné lieu à une première version sortie le 1er mars 2012. Développé au début par Nils Adermann et Jordi Boggiano (Belge :) ) , le projet est maintenant disponible sur la plateforme GitHub. Il est ainsi développé par toute une communauté.
Composer est à l’initiative d’un portage en PHP de Libzypp satsolver d’Open Suse.
Il faut l’avouer, en PHP, nous avons tendance à réinventer la roue, il nous est tous arrivé de coder une librairie sans chercher avant si quelqu’un l’avait déjà faite. Pourquoi ? Très certainement parce que malgré l’existence de PEAR, le monde PHP n’a pendant très longtemps pas eu de système de gestion de dépendances simple à utiliser par les développeurs de librairies et leurs utilisateurs.
[1] | Merci Jolicode. |
curl -s http://getcomposer.org/installer | php
Télécharger l’éxécutable Composer-Setup.exe sur le site
Avec les fonctions PHP directement.
php -r "readfile('https://getcomposer.org/installer');" | php
Si vous êtes si un Unix-like, je vous conseille de déplacer cette librairie dans /usr/bin, afin de pouvoir l’utiliser dans tout votre environement.
mv composer.phar /usr/bin/composer
chmod r+x /usr/bin/composer
Vous pourrez retrouver l’ensemble des travaux disponible sur le site de packagist
Composer est basé sur la lecture d’un fichier Json, ce fichier est généré automatiquement lorsque l’on install un projet complet tel que CakePHP par exemple.
Nous allons créer notre propre fichier Json grâce à composer et commencer directement à travailler avec.
Créons un répertoire exoEsa et tapons la commande suivante :
composer init
Il suffit ensuite de répondre au questions, celle par défaut sont très bien pour une première.
Welcome to the Composer config generator
This command will guide you through creating your composer.json config.
Package name (<vendor>/<name>) [root/exo-esa]: maitrepylos/exo-esa
Description []:
Author [None <ernaelsten@gmail.com>]: MaitrePylos <info@formatux.be>
Minimum Stability []:
Package Type []:
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
{
"name": "maitrepylos/exo-esa",
"authors": [
{
"name": "MaitrePylos",
"email": "info@formatux.be"
}
],
"require": {}
}
Do you confirm generation [yes]? yes
Resultat : composer.json
{
"name": "maitrepylos/exo-esa",
"authors": [
{
"name": "MaitrePylos",
"email": "info@formatux.be"
}
],
"require": {}
}
Nous avons donc maintenant un fichier Json à la racine. Nous allons l’installer et créer automatiquement le structure initié par Composer.
composer install
Cela va créer un répertoire vendor avec un fichier autoloader.php et un autre répartoire composer
├── composer.json
└── vendor
├── autoload.php
└── composer
├── autoload_classmap.php
├── autoload_namespaces.php
├── autoload_psr4.php
├── autoload_real.php
├── ClassLoader.php
└── installed.json
Ok, maintenant je veux utiliser le tout pour me faciliter la vie.
Nous allons par exemple tester ce qui est le plus rapide pour parcourir le tableau suivant :
<?php
$tab = ['Gg','est','le','plus','beau'];
Pour ce faire nous avons besoin d’une classe de Benchmark, cela tombe bien, il y a un super projet qui se nomme Hoa et qui possède une telle librairie HoaBench Il faut modifier le fichier Json pour qu’il prenne en compte cette librairie :
{
"name": "maitrepylos/exo-esa",
"authors": [
{
"name": "MaitrePylos",
"email": "info@formatux.be"
}
],
"require": {
"hoa/bench": "~2.0"
}
}
Ensuite on update composer
composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing hoa/core (2.15.07.07)
Downloading: 100%
- Installing hoa/iterator (1.15.05.29)
Downloading: 100%
- Installing hoa/bench (2.15.05.29)
Downloading: 100%
hoa/core suggests installing hoa/console (To use the `hoa` script.)
hoa/core suggests installing hoa/dispatcher (To use the `hoa` script.)
hoa/core suggests installing hoa/router (To use the `hoa` script.)
Writing lock file
Generating autoload files
On remarque que nous avons demandé hoa/bench, mais il installe aussi hoa/iterator et hoa/core C’est normal, si je récupère le composer.json de hoabench, j’ai ceci :
{
"name" : "hoa/bench",
"description": "The Hoa\\Bench library.",
"type" : "library",
"keywords" : ["library", "bench", "performance", "time", "dtrace",
"trace", "analyze"],
"homepage" : "http://hoa-project.net/",
"license" : "BSD-3-Clause",
"authors" : [
{
"name" : "Ivan Enderlin",
"email": "ivan.enderlin@hoa-project.net"
},
{
"name" : "Hoa community",
"homepage": "http://hoa-project.net/"
}
],
"support": {
"email" : "support@lists.hoa-project.net",
"irc" : "irc://irc.freenode.org/hoaproject",
"source": "http://git.hoa-project.net/"
},
"require": {
"hoa/core" : "~2.0",
"hoa/iterator": "~1.0"
},
"autoload": {
"psr-4": {
"Hoa\\Bench\\": "."
}
},
"extra": {
"branch-alias": {
"dev-master": "2.x-dev"
}
}
}
On remarque que celui-ci est plus complet que le nôtre, mais qu’il demande des require lui aussi, donc il les installes automatiquement, composer le fait pour nous....simple :)
Notre répertoire s’étoffe de quelques fichiers et répertoires.
├── composer.json
├── composer.lock
└── vendor
├── autoload.php
├── bin
│ └── hoa -> ../hoa/core/Bin/hoa
├── composer
│ ├── autoload_classmap.php
│ ├── autoload_files.php
│ ├── autoload_namespaces.php
│ ├── autoload_psr4.php
│ ├── autoload_real.php
│ ├── ClassLoader.php
│ └── installed.json
└── hoa
├── bench
│ ├── Bench.php
│ ├── CHANGELOG.md
│ ├── composer.json
│ ├── Documentation
│ │ ├── En
│ │ │ └── Index.xyl
│ │ └── Fr
│ │ └── Index.xyl
│ ├── Dtrace
│ │ ├── Execution.d
│ │ └── Stat.d
│ ├── Exception.php
│ ├── Mark.php
│ └── README.md
├── core
│ ├── Bin
│ │ ├── hoa
│ │ ├── hoa.bat
│ │ ├── Hoa.php
│ │ ├── Resolve.php
│ │ ├── Uuid.php
│ │ └── Welcome.php
│ ├── CHANGELOG.md
│ ├── composer.json
│ ├── Consistency.php
│ ├── Core.php
│ ├── Data.php
│ ├── Event.php
│ ├── Exception.php
│ ├── Parameter.php
│ ├── Protocol.php
│ └── README.md
└── iterator
├── Aggregate.php
├── Append.php
......
Créons notre fichier index.php et commençont par inclure le fichier autoload de composer.
<?php
require 'vendor/autoload.php';
Ensuite pour utiliser Hoa/bench nous devons l’appeler et pour cela nous utiliserons le mot clès use, comme vu dans le chapitre sur les namespaces:
require 'vendor/autoload.php';
use Hoa\Bench;
Maintenant nous pouvons utiliser la librairie, on commence par vérifier que cela fonctionne :
require 'vendor/autoload.php';
use Hoa\Bench;
$bench = new Bench();
$bench->one->start();
usleep(5000);
$bench->one->stop();
echo $bench;
__global__ |||||||||||||||||||||||||||||||||||||||||||||||||||| 5ms, 100.1%
one |||||||||||||||||||||||||||||||||||||||||||||||||||| 5ms, 99.3%
Vérifions maintenant qui est le plus rapide pour la lecture de mon tableau :
require 'vendor/autoload.php';
use Hoa\Bench;
$tab = \SplFixedArray::fromArray(['Gg', 'est', 'le', 'plus', 'beau']);
$bench = new Bench();
$bench->one->start();
for($i=0;$i<$tab->count();$i++){
echo $tab[$i];
}
$bench->one->stop();
$bench->two->start();
//le foreach
foreach($tab as $value){
echo $value;
}
$bench->two->stop();
echo $bench;
__global__ |||||||||||||||||||||||||||||||||||||||||||||||||||||| 0ms, 104.1%
one |||||||||||||||||||||| 0ms, 43.2%
two |||||||||| 0ms, 19.1%
Il est évident que nous pourrions par la même utiliser nos propres classes :
Imaginons que nous voulons créer une classe qui nous retourne une date formaté correctement en fonction de si on veut la mettre dans la db ou la sortir de la db et l’afficher.
Nous aurions quelque chose du genre :
<?php
namespace Maitrepylos;
class Date
{
public static function dateToDb($date){
$d = new \DateTime($date);
return $d->format('Y-m-d');
}
public static function dbToDate($date)
{
$d = new \DateTime($date);
return $d->format('d/m/Y');
}
}
Cette classe devras être écrite dans vendor/Maitrepylos/Date.php
Puis il faut dire à composer de l’utiliser
{
"name": "maitrepylos/exo-esa",
"authors": [
{
"name": "MaitrePylos",
"email": "info@formatux.be"
}
],
"require": {
"hoa/bench": "~2.0"
},
"autoload": {
"psr-4": {
"Maitrepylos\\": "./vendor/maitrepylos"
}
}
}
On update composer.
Ensuite on informe de l’utilisation de cette classe via le use
<?php
ini_set('date.timezone', 'Europe/Brussels');
require __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
use Maitrepylos\Dates as d;
echo d::dateToDb('27/02/197');