Composer ========== 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. Pourquoi ? [1]_ ---------- 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. Installation: ------------- Linux : ******* .. code-block:: bash curl -s http://getcomposer.org/installer | php Windows : ********* Télécharger l'éxécutable Composer-Setup.exe sur le site Manuelle : *********** Avec les fonctions PHP directement. .. code-block:: php 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. .. code-block:: bash 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 `_ Le fichier Json ---------------- 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 : .. code-block:: bash composer init Il suffit ensuite de répondre au questions, celle par défaut sont très bien pour une première. .. code-block:: bash Welcome to the Composer config generator This command will guide you through creating your composer.json config. Package name (/) [root/exo-esa]: maitrepylos/exo-esa Description []: Author [None ]: MaitrePylos 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 .. code-block:: 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. .. code-block:: bash composer install Cela va créer un répertoire **vendor** avec un fichier autoloader.php et un autre répartoire composer .. code-block:: bash ├── composer.json └── vendor ├── autoload.php └── composer ├── autoload_classmap.php ├── autoload_namespaces.php ├── autoload_psr4.php ├── autoload_real.php ├── ClassLoader.php └── installed.json Utilisation ------------ 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 : .. code-block:: php `_ Il faut modifier le fichier Json pour qu'il prenne en compte cette librairie : .. code-block:: bash { "name": "maitrepylos/exo-esa", "authors": [ { "name": "MaitrePylos", "email": "info@formatux.be" } ], "require": { "hoa/bench": "~2.0" } } Ensuite on update composer .. code-block:: bash 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 hoa\bench, j'ai ceci : .. code-block:: bash { "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. .. code-block:: bash ├── 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. .. code-block:: php one->start(); usleep(5000); $bench->one->stop(); echo $bench; .. code-block:: bash __global__ |||||||||||||||||||||||||||||||||||||||||||||||||||| 5ms, 100.1% one |||||||||||||||||||||||||||||||||||||||||||||||||||| 5ms, 99.3% Vérifions maintenant qui est le plus rapide pour la lecture de mon tableau : .. code-block:: php 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; .. code-block:: bash __global__ |||||||||||||||||||||||||||||||||||||||||||||||||||||| 0ms, 104.1% one |||||||||||||||||||||| 0ms, 43.2% two |||||||||| 0ms, 19.1% Nos propres classes ------------------- 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 : .. code-block:: php 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 .. code-block:: json { "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** .. code-block:: php