{"id":2765,"date":"2021-10-16T07:25:07","date_gmt":"2021-10-16T05:25:07","guid":{"rendered":"http:\/\/blogperso.union31.fr\/?p=2765"},"modified":"2021-11-03T11:46:06","modified_gmt":"2021-11-03T10:46:06","slug":"php-composer","status":"publish","type":"post","link":"https:\/\/blogperso.union31.fr\/?p=2765","title":{"rendered":"PHP : composer (gestionnaire de d\u00e9pendances)"},"content":{"rendered":"\n<p>Composer est un outil qui permet de g\u00e9rer les d\u00e9pendances pour un projet PHP. Il permet d&rsquo; automatiser l&rsquo;installation de modules ainsi que leurs mises \u00e0 jour. il permet \u00e9galement de cr\u00e9er ses propres packages et de les distribuer. Cela peut \u00eatre consid\u00e9r\u00e9 comme un \u00ab\u00a0apt\u00a0\u00bb pour php. Nous allons voir comment installer cet outil et comment l&rsquo;utiliser pour t\u00e9l\u00e9charger les modules dans un projet PHP.<\/p>\n\n\n\n<p>L&rsquo;environnement est le suivant :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>syst\u00e8me Linux sous Ubuntu 20.4 ;<\/li><li>apache install\u00e9 ;<\/li><li>php install\u00e9.<\/li><\/ul>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Sommaire<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/blogperso.union31.fr\/?p=2765\/#I_Installation_de_%C2%AB_composer_%C2%BB\" >I Installation de \u00ab\u00a0composer\u00a0\u00bb<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/blogperso.union31.fr\/?p=2765\/#II_Utilisation_de_%C2%AB_composer_%C2%BB\" >II Utilisation de \u00ab\u00a0composer\u00a0\u00bb<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/blogperso.union31.fr\/?p=2765\/#II1_Initialisation_du_projet\" >II.1 Initialisation du projet<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/blogperso.union31.fr\/?p=2765\/#II2_Premiere_personnalisation\" >II.2 Premi\u00e8re personnalisation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/blogperso.union31.fr\/?p=2765\/#II3_Installation_dun_module\" >II.3 Installation d&rsquo;un module<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/blogperso.union31.fr\/?p=2765\/#II4_Mise_a_jour_reinstallation_etc\" >II.4 Mise \u00e0 jour, r\u00e9installation, etc.<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/blogperso.union31.fr\/?p=2765\/#II41_Installation_des_modules_a_partir_dun_fichier_composerjson_existant\" >II.4.1 Installation des modules \u00e0 partir d&rsquo;un fichier composer.json existant<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/blogperso.union31.fr\/?p=2765\/#II42_Mise_a_jour_des_modules\" >II.4.2 Mise \u00e0 jour des modules<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/blogperso.union31.fr\/?p=2765\/#II43_Trouver_des_modules\" >II.4.3 Trouver des modules<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/blogperso.union31.fr\/?p=2765\/#II44_Autres\" >II.4.4 Autres<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/blogperso.union31.fr\/?p=2765\/#III_Partie_PHP\" >III Partie PHP<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/blogperso.union31.fr\/?p=2765\/#III1_Autoload\" >III.1 Autoload<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/blogperso.union31.fr\/?p=2765\/#III11_LAutoload_par_defaut\" >III.1.1 L&rsquo;Autoload par d\u00e9faut<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/blogperso.union31.fr\/?p=2765\/#III12_Charger_ses_propres_classes\" >III.1.2 Charger ses propres classes<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/blogperso.union31.fr\/?p=2765\/#III2_Exemple_dutilisation_avec_module_SLIM4\" >III.2 Exemple d&rsquo;utilisation avec module SLIM4<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"I_Installation_de_%C2%AB_composer_%C2%BB\"><\/span>I Installation de \u00ab\u00a0composer\u00a0\u00bb<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Pour installer composer :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">php -r \"copy('https:\/\/getcomposer.org\/installer', 'composer-setup.php');\"\nphp -r \"if (hash_file('sha384', 'composer-setup.php') === '906a84df04cea2aa72f40b5f787e49f22d4c2f19492ac310e8cba5b96ac8b64115ac402c8cd292b8a03482574915d1a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;\"\nphp composer-setup.php\nphp -r \"unlink('composer-setup.php');\"<\/code><\/pre>\n\n\n\n<p>Pour lancer composer en ligne de commande sans le pr\u00e9fixe php :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">sudo mv composer.phar \/usr\/local\/bin\/composer<\/code><\/pre>\n\n\n\n<p>Pour v\u00e9rifier l&rsquo;installation :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">composer\n   ______\n  \/ ____\/___  ____ ___  ____  ____  ________  _____\n \/ \/   \/ __ \\\/ __ `__ \\\/ __ \\\/ __ \\\/ ___\/ _ \\\/ ___\/\n\/ \/___\/ \/_\/ \/ \/ \/ \/ \/ \/ \/_\/ \/ \/_\/ (__  )  __\/ \/\n\\____\/\\____\/_\/ \/_\/ \/_\/ .___\/\\____\/____\/\\___\/_\/\n                    \/_\/\nComposer version 2.1.9 2021-10-05 09:47:38\n\nUsage:\n  command [options] [arguments]\n\nOptions:\n...<\/code><\/pre>\n\n\n\n<p>Pour plus d&rsquo;informations et obtenir la derni\u00e8re version, aller sur le site officiel : <a rel=\"noreferrer noopener\" href=\"https:\/\/getcomposer.org\/download\/\" target=\"_blank\">lien<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"II_Utilisation_de_%C2%AB_composer_%C2%BB\"><\/span>II Utilisation de \u00ab\u00a0composer\u00a0\u00bb<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"II1_Initialisation_du_projet\"><\/span>II.1 Initialisation du projet<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Toutes les librairies sont inscrites dans un fichier qui se nomme \u00ab\u00a0composer.json\u00a0\u00bb. Il peut \u00eatre cr\u00e9\u00e9 \u00e0 la main ce que nous ne ferons pas dans un premier temps.<\/p>\n\n\n\n<p>Avant de lancer composer, nous allons cr\u00e9er une structure de travail qui sera la suivante !<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">test\/\n\u2514\u2500\u2500 site\n    \u251c\u2500\u2500 index.php\n    \u251c\u2500\u2500 prive\n    \u2514\u2500\u2500 public\n<\/code><\/pre>\n\n\n\n<p>Se placer \u00e0 la racine de test en ligne de commande.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">composer init<\/code><\/pre>\n\n\n\n<p>exemple de sortie :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">                                            \n  Welcome to the Composer config generator  \n                                            \n\n\nThis command will guide you through creating your composer.json config.\n\nPackage name (&lt;vendor&gt;\/&lt;name&gt;) [xavior\/test_slim2]: union31\/test         \nDescription []: test de composer\nAuthor [, n to skip]: Union31 &lt;union31@union31.fr&gt;\nMinimum Stability []: stable\nPackage Type (e.g. library, project, metapackage, composer-plugin) []: project\nLicense []:   \n\nDefine your dependencies.\n\nWould you like to define your dependencies (require) interactively [yes]? no\nWould you like to define your dev dependencies (require-dev) interactively [yes]? no\nAdd PSR-4 autoload mapping? Maps namespace \"Union31\\Test\" to the entered relative path. [src\/, n to skip]: \n\n{\n    \"name\": \"union31\/test\",\n    \"description\": \"test de composer\",\n    \"type\": \"project\",\n    \"autoload\": {\n        \"psr-4\": {\n            \"Union31\\\\Test\\\\\": \"src\/\"\n        }\n    },\n    \"authors\": [\n        {\n            \"name\": \"Union31\",\n            \"email\": \"union31@union31.fr\"\n        }\n    ],\n    \"minimum-stability\": \"stable\",\n    \"require\": {}\n}\n\nDo you confirm generation [yes]? \nGenerating autoload files\nGenerated autoload files\nPSR-4 autoloading configured. Use \"namespace Union31\\Test;\" in src\/\nInclude the Composer autoloader with: require 'vendor\/autoload.php';\n<\/code><\/pre>\n\n\n\n<p>A ce stade le fichier composer.json est cr\u00e9e \u00e0 la racine du projet. De plus les r\u00e9pertoires \u00ab\u00a0src\u00a0\u00bb et \u00ab\u00a0vendor\u00a0\u00bb ont \u00e9t\u00e9 cr\u00e9\u00e9s.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">.\n\u251c\u2500\u2500 composer.json\n\u251c\u2500\u2500 site\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 index.php\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 prive\n\u2502&nbsp;&nbsp; \u2514\u2500\u2500 public\n\u251c\u2500\u2500 src\n\u2514\u2500\u2500 vendor\n    \u251c\u2500\u2500 autoload.php\n    \u2514\u2500\u2500 composer\n        \u251c\u2500\u2500 autoload_classmap.php\n        \u251c\u2500\u2500 autoload_namespaces.php\n        \u251c\u2500\u2500 autoload_psr4.php\n        \u251c\u2500\u2500 autoload_real.php\n        \u251c\u2500\u2500 autoload_static.php\n        \u251c\u2500\u2500 ClassLoader.php\n        \u2514\u2500\u2500 LICENSE\n<\/code><\/pre>\n\n\n\n<p>Les modules seront stock\u00e9s dans le r\u00e9pertoire \u00ab\u00a0vendor\u00a0\u00bb. <\/p>\n\n\n\n<p>la composition du fichier composer.json ressemblera \u00e0 ceci :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"json\" class=\"language-json\">{\n    \"name\": \"union31\/test\",\n    \"description\": \"test de composer\",\n    \"type\": \"project\",\n    \"autoload\": {\n        \"psr-4\": {\n            \"Union31\\\\Test\\\\\": \"src\/\"\n        }\n    },\n    \"authors\": [\n        {\n            \"name\": \"Union31\",\n            \"email\": \"union31@union31.fr\"\n        }\n    ],\n    \"minimum-stability\": \"stable\",\n    \"require\": {}\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"II2_Premiere_personnalisation\"><\/span>II.2 Premi\u00e8re personnalisation<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>J&rsquo;aimerais n\u00e9anmoins que les modules se trouvent dans le r\u00e9pertoire vendor et non \u00e0 la racine du site.<\/p>\n\n\n\n<p>Pour cela, il faut modifier le fichier composer.json \u00e0 la main et comme suivant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">{\n    \"name\": \"union31\/test\",\n    \"description\": \"test de composer\",\n    \"type\": \"project\",\n    \"autoload\": {\n        \"psr-4\": {\n            \"Union31\\\\Test\\\\\": \"site\/\"\n        }\n    },\n    \"authors\": [\n        {\n            \"name\": \"Union31\",\n            \"email\": \"union31@union31.fr\"\n        }\n    ],\n    \"minimum-stability\": \"stable\",\n    \"require\": {},\n    \"config\": {\n        \"vendor-dir\": \".\/site\/prive\/vendor\"\n    }\n}<\/code><\/pre>\n\n\n\n<p>Ensuite mettre \u00e0 jour composer :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">composer update\nLoading composer repositories with package information\nUpdating dependencies\nNothing to modify in lock file\nInstalling dependencies from lock file (including require-dev)\nNothing to install, update or remove\nGenerating autoload files\n<\/code><\/pre>\n\n\n\n<p>Ce qui donne la structure suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">.\n\u251c\u2500\u2500 composer.json\n\u251c\u2500\u2500 composer.lock\n\u251c\u2500\u2500 site\n\u2502   \u251c\u2500\u2500 index.php\n\u2502   \u251c\u2500\u2500 prive\n\u2502   \u2502   \u2514\u2500\u2500 vendor\n\u2502   \u2502       \u251c\u2500\u2500 autoload.php\n\u2502   \u2502       \u2514\u2500\u2500 composer\n\u2502   \u2502           \u251c\u2500\u2500 autoload_classmap.php\n\u2502   \u2502           \u251c\u2500\u2500 autoload_namespaces.php\n\u2502   \u2502           \u251c\u2500\u2500 autoload_psr4.php\n\u2502   \u2502           \u251c\u2500\u2500 autoload_real.php\n\u2502   \u2502           \u251c\u2500\u2500 autoload_static.php\n\u2502   \u2502           \u251c\u2500\u2500 ClassLoader.php\n\u2502   \u2502           \u251c\u2500\u2500 installed.json\n\u2502   \u2502           \u251c\u2500\u2500 installed.php\n\u2502   \u2502           \u251c\u2500\u2500 InstalledVersions.php\n\u2502   \u2502           \u2514\u2500\u2500 LICENSE\n\u2502   \u2514\u2500\u2500 public\n\u251c\u2500\u2500 src\n\u2514\u2500\u2500 vendor\n    \u251c\u2500\u2500 autoload.php\n    \u2514\u2500\u2500 composer\n        \u251c\u2500\u2500 autoload_classmap.php\n        \u251c\u2500\u2500 autoload_namespaces.php\n        \u251c\u2500\u2500 autoload_psr4.php\n        \u251c\u2500\u2500 autoload_real.php\n        \u251c\u2500\u2500 autoload_static.php\n        \u251c\u2500\u2500 ClassLoader.php\n        \u2514\u2500\u2500 LICENSE<\/code><\/pre>\n\n\n\n<p>Nous pouvons supprimer les r\u00e9pertoires \/src et \/vendor pour avoir au final ceci :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">.\n\u251c\u2500\u2500 composer.json\n\u251c\u2500\u2500 composer.lock\n\u2514\u2500\u2500 site\n    \u251c\u2500\u2500 index.php\n    \u251c\u2500\u2500 prive\n    \u2502&nbsp;&nbsp; \u2514\u2500\u2500 vendor\n    \u2502&nbsp;&nbsp;     \u251c\u2500\u2500 autoload.php\n    \u2502&nbsp;&nbsp;     \u2514\u2500\u2500 composer\n    \u2502&nbsp;&nbsp;         \u251c\u2500\u2500 autoload_classmap.php\n    \u2502&nbsp;&nbsp;         \u251c\u2500\u2500 autoload_namespaces.php\n    \u2502&nbsp;&nbsp;         \u251c\u2500\u2500 autoload_psr4.php\n    \u2502&nbsp;&nbsp;         \u251c\u2500\u2500 autoload_real.php\n    \u2502&nbsp;&nbsp;         \u251c\u2500\u2500 autoload_static.php\n    \u2502&nbsp;&nbsp;         \u251c\u2500\u2500 ClassLoader.php\n    \u2502&nbsp;&nbsp;         \u251c\u2500\u2500 installed.json\n    \u2502&nbsp;&nbsp;         \u251c\u2500\u2500 installed.php\n    \u2502&nbsp;&nbsp;         \u251c\u2500\u2500 InstalledVersions.php\n    \u2502&nbsp;&nbsp;         \u2514\u2500\u2500 LICENSE\n    \u2514\u2500\u2500 public\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"II3_Installation_dun_module\"><\/span>II.3 Installation d&rsquo;un module<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Nous allons installer SLIM qui permet de g\u00e9rer des routes HTML.<\/p>\n\n\n\n<p>Pour cela il faut utiliser la commande \u00ab\u00a0composer require le_nom_du_module\u00a0\u00bb :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">composer require slim\/slim:\"4.*\"<\/code><\/pre>\n\n\n\n<p>Ce qui donne :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">.\/composer.json has been updated\nRunning composer update slim\/slim\nLoading composer repositories with package information\nUpdating dependencies\nLock file operations: 8 installs, 0 updates, 0 removals\n  - Locking nikic\/fast-route (v1.3.0)\n  - Locking psr\/container (2.0.1)\n  - Locking psr\/http-factory (1.0.1)\n  - Locking psr\/http-message (1.0.1)\n  - Locking psr\/http-server-handler (1.0.1)\n  - Locking psr\/http-server-middleware (1.0.1)\n  - Locking psr\/log (1.1.4)\n  - Locking slim\/slim (4.9.0)\nWriting lock file\nInstalling dependencies from lock file (including require-dev)\nPackage operations: 8 installs, 0 updates, 0 removals\n  - Installing psr\/log (1.1.4): Extracting archive\n  - Installing psr\/http-message (1.0.1): Extracting archive\n  - Installing psr\/http-server-handler (1.0.1): Extracting archive\n  - Installing psr\/http-server-middleware (1.0.1): Extracting archive\n  - Installing psr\/http-factory (1.0.1): Extracting archive\n  - Installing psr\/container (2.0.1): Extracting archive\n  - Installing nikic\/fast-route (v1.3.0): Extracting archive\n  - Installing slim\/slim (4.9.0): Extracting archive\n2 package suggestions were added by new dependencies, use `composer suggest` to see details.\nGenerating autoload files\n1 package you are using is looking for funding.\nUse the `composer fund` command to find out more!<\/code><\/pre>\n\n\n\n<p>Et il faut \u00e9galement installer module suivant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">composer require slim\/psr7<\/code><\/pre>\n\n\n\n<p>Nous avons maintenant la structure suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">.\n\u2514\u2500\u2500 site\n    \u251c\u2500\u2500 prive\n    \u2502   \u2514\u2500\u2500 vendor\n    \u2502       \u251c\u2500\u2500 composer\n    \u2502       \u251c\u2500\u2500 fig\n    \u2502       \u2502   \u2514\u2500\u2500 http-message-util\n    \u2502       \u2502       \u2514\u2500\u2500 src\n    \u2502       \u251c\u2500\u2500 nikic\n    \u2502       \u2502   \u2514\u2500\u2500 fast-route\n    \u2502       \u2502       \u251c\u2500\u2500 src\n    \u2502       \u2502       \u2502   \u251c\u2500\u2500 DataGenerator\n    \u2502       \u2502       \u2502   \u251c\u2500\u2500 Dispatcher\n    \u2502       \u2502       \u2502   \u2514\u2500\u2500 RouteParser\n    \u2502       \u2502       \u2514\u2500\u2500 test\n    \u2502       \u2502           \u251c\u2500\u2500 Dispatcher\n    \u2502       \u2502           \u251c\u2500\u2500 HackTypechecker\n    \u2502       \u2502           \u2502   \u2514\u2500\u2500 fixtures\n    \u2502       \u2502           \u2514\u2500\u2500 RouteParser\n    \u2502       \u251c\u2500\u2500 psr\n    \u2502       \u2502   \u251c\u2500\u2500 container\n    \u2502       \u2502   \u2502   \u2514\u2500\u2500 src\n    \u2502       \u2502   \u251c\u2500\u2500 http-factory\n    \u2502       \u2502   \u2502   \u2514\u2500\u2500 src\n    \u2502       \u2502   \u251c\u2500\u2500 http-message\n    \u2502       \u2502   \u2502   \u2514\u2500\u2500 src\n    \u2502       \u2502   \u251c\u2500\u2500 http-server-handler\n    \u2502       \u2502   \u2502   \u2514\u2500\u2500 src\n    \u2502       \u2502   \u251c\u2500\u2500 http-server-middleware\n    \u2502       \u2502   \u2502   \u2514\u2500\u2500 src\n    \u2502       \u2502   \u2514\u2500\u2500 log\n    \u2502       \u2502       \u2514\u2500\u2500 Psr\n    \u2502       \u2502           \u2514\u2500\u2500 Log\n    \u2502       \u2502               \u2514\u2500\u2500 Test\n    \u2502       \u251c\u2500\u2500 ralouphie\n    \u2502       \u2502   \u2514\u2500\u2500 getallheaders\n    \u2502       \u2502       \u2514\u2500\u2500 src\n    \u2502       \u251c\u2500\u2500 slim\n    \u2502       \u2502   \u251c\u2500\u2500 psr7\n    \u2502       \u2502   \u2502   \u2514\u2500\u2500 src\n    \u2502       \u2502   \u2502       \u251c\u2500\u2500 Factory\n    \u2502       \u2502   \u2502       \u2514\u2500\u2500 Interfaces\n    \u2502       \u2502   \u2514\u2500\u2500 slim\n    \u2502       \u2502       \u2514\u2500\u2500 Slim\n    \u2502       \u2502           \u251c\u2500\u2500 Error\n    \u2502       \u2502           \u2502   \u2514\u2500\u2500 Renderers\n    \u2502       \u2502           \u251c\u2500\u2500 Exception\n    \u2502       \u2502           \u251c\u2500\u2500 Factory\n    \u2502       \u2502           \u2502   \u2514\u2500\u2500 Psr17\n    \u2502       \u2502           \u251c\u2500\u2500 Handlers\n    \u2502       \u2502           \u2502   \u2514\u2500\u2500 Strategies\n    \u2502       \u2502           \u251c\u2500\u2500 Interfaces\n    \u2502       \u2502           \u251c\u2500\u2500 Middleware\n    \u2502       \u2502           \u2514\u2500\u2500 Routing\n    \u2502       \u2514\u2500\u2500 symfony\n    \u2502           \u2514\u2500\u2500 polyfill-php80\n    \u2502               \u2514\u2500\u2500 Resources\n    \u2502                   \u2514\u2500\u2500 stubs\n    \u2514\u2500\u2500 public<\/code><\/pre>\n\n\n\n<p>Un nouveau fichier \u00e0 la racine a \u00e9t\u00e9 cr\u00e9e automatiquement : \u00ab\u00a0<strong>composer.lock<\/strong>\u00a0\u00bb (a ne pas modifier manuellement). Dans le r\u00e9pertoire vendor il est apparu de nouveaux r\u00e9pertoires correpondants aux modules demand\u00e9s et autres modules necessaires pour le bon fonction des premiers. Enfin, le fichier \u00ab\u00a0composer.json\u00a0\u00bb a \u00e9t\u00e9 modifi\u00e9 et dont le contenu est maintenant le suivant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"json\" class=\"language-json\">{\n    \"name\": \"union31\/test\",\n    \"description\": \"test de composer\",\n    \"type\": \"project\",\n    \"autoload\": {\n        \"psr-4\": {\n            \"Union31\\\\Test\\\\\": \"site\/\"\n        }\n    },\n    \"authors\": [\n        {\n            \"name\": \"Union31\",\n            \"email\": \"union31@union31.fr\"\n        }\n    ],\n    \"minimum-stability\": \"stable\",\n    \"require\": {\n        \"slim\/slim\": \"4.*\",\n        \"slim\/psr7\": \"^1.5\"\n    },\n    \"config\": {\n        \"vendor-dir\": \".\/site\/prive\/vendor\"\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>Dans le fichier JSON nous voyons bien les 2 modules demand\u00e9s.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"II4_Mise_a_jour_reinstallation_etc\"><\/span>II.4 Mise \u00e0 jour, r\u00e9installation, etc.<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"II41_Installation_des_modules_a_partir_dun_fichier_composerjson_existant\"><\/span>II.4.1 Installation des modules \u00e0 partir d&rsquo;un fichier composer.json existant<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>Dans la r\u00e9cup\u00e9ration de projets, et si composer est utilis\u00e9, g\u00e9n\u00e9rallement les sources des modules ne sont pas contenus dans le projet. N\u00e9anmoins le fichier composer.json existe et ce dernier indique quels modules sont n\u00e9cessaires.<\/p>\n\n\n\n<p>Nous allons donc se placer dans ce cas. Pour cela nous allons supprimer le r\u00e9pertoire vendor de la structure de fichiers :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">rm -R .\/site\/prive\/vendor<\/code><\/pre>\n\n\n\n<p>ce qui donne :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">.\n\u251c\u2500\u2500 composer.json\n\u251c\u2500\u2500 composer.lock\n\u2514\u2500\u2500 site\n    \u251c\u2500\u2500 index.php\n    \u251c\u2500\u2500 prive\n    \u2514\u2500\u2500 public\n<\/code><\/pre>\n\n\n\n<p>Pour installer les modules il faut indiquer la commande suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">composer install<\/code><\/pre>\n\n\n\n<p>ce qui donne :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">Installing dependencies from lock file (including require-dev)\nVerifying lock file contents can be installed on current platform.\nPackage operations: 12 installs, 0 updates, 0 removals\n  - Installing symfony\/polyfill-php80 (v1.23.1): Extracting archive\n  - Installing ralouphie\/getallheaders (3.0.3): Extracting archive\n  - Installing psr\/http-message (1.0.1): Extracting archive\n  - Installing psr\/http-factory (1.0.1): Extracting archive\n  - Installing fig\/http-message-util (1.1.5): Extracting archive\n  - Installing slim\/psr7 (1.5): Extracting archive\n  - Installing psr\/log (1.1.4): Extracting archive\n  - Installing psr\/http-server-handler (1.0.1): Extracting archive\n  - Installing psr\/http-server-middleware (1.0.1): Extracting archive\n  - Installing psr\/container (2.0.1): Extracting archive\n  - Installing nikic\/fast-route (v1.3.0): Extracting archive\n  - Installing slim\/slim (4.9.0): Extracting archive\nGenerating autoload files\n2 packages you are using are looking for funding.\nUse the `composer fund` command to find out more!\n<\/code><\/pre>\n\n\n\n<p>Et la structure sera la suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">.\n\u2514\u2500\u2500 site\n    \u251c\u2500\u2500 prive\n    \u2502&nbsp;&nbsp; \u2514\u2500\u2500 vendor\n    \u2502&nbsp;&nbsp;     \u251c\u2500\u2500 composer\n    \u2502&nbsp;&nbsp;     \u251c\u2500\u2500 fig\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u2514\u2500\u2500 http-message-util\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;     \u2514\u2500\u2500 src\n    \u2502&nbsp;&nbsp;     \u251c\u2500\u2500 nikic\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u2514\u2500\u2500 fast-route\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;     \u251c\u2500\u2500 src\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u251c\u2500\u2500 DataGenerator\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u251c\u2500\u2500 Dispatcher\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u2514\u2500\u2500 RouteParser\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;     \u2514\u2500\u2500 test\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;         \u251c\u2500\u2500 Dispatcher\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;         \u251c\u2500\u2500 HackTypechecker\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;         \u2502&nbsp;&nbsp; \u2514\u2500\u2500 fixtures\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;         \u2514\u2500\u2500 RouteParser\n    \u2502&nbsp;&nbsp;     \u251c\u2500\u2500 psr\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u251c\u2500\u2500 container\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2514\u2500\u2500 src\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u251c\u2500\u2500 http-factory\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2514\u2500\u2500 src\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u251c\u2500\u2500 http-message\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2514\u2500\u2500 src\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u251c\u2500\u2500 http-server-handler\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2514\u2500\u2500 src\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u251c\u2500\u2500 http-server-middleware\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2514\u2500\u2500 src\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u2514\u2500\u2500 log\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;     \u2514\u2500\u2500 Psr\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;         \u2514\u2500\u2500 Log\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;             \u2514\u2500\u2500 Test\n    \u2502&nbsp;&nbsp;     \u251c\u2500\u2500 ralouphie\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u2514\u2500\u2500 getallheaders\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;     \u2514\u2500\u2500 src\n    \u2502&nbsp;&nbsp;     \u251c\u2500\u2500 slim\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u251c\u2500\u2500 psr7\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2514\u2500\u2500 src\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp;     \u251c\u2500\u2500 Factory\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp;     \u2514\u2500\u2500 Interfaces\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp; \u2514\u2500\u2500 slim\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;     \u2514\u2500\u2500 Slim\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;         \u251c\u2500\u2500 Error\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;         \u2502&nbsp;&nbsp; \u2514\u2500\u2500 Renderers\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;         \u251c\u2500\u2500 Exception\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;         \u251c\u2500\u2500 Factory\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;         \u2502&nbsp;&nbsp; \u2514\u2500\u2500 Psr17\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;         \u251c\u2500\u2500 Handlers\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;         \u2502&nbsp;&nbsp; \u2514\u2500\u2500 Strategies\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;         \u251c\u2500\u2500 Interfaces\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;         \u251c\u2500\u2500 Middleware\n    \u2502&nbsp;&nbsp;     \u2502&nbsp;&nbsp;         \u2514\u2500\u2500 Routing\n    \u2502&nbsp;&nbsp;     \u2514\u2500\u2500 symfony\n    \u2502&nbsp;&nbsp;         \u2514\u2500\u2500 polyfill-php80\n    \u2502&nbsp;&nbsp;             \u2514\u2500\u2500 Resources\n    \u2502&nbsp;&nbsp;                 \u2514\u2500\u2500 stubs\n    \u2514\u2500\u2500 public<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"II42_Mise_a_jour_des_modules\"><\/span>II.4.2 Mise \u00e0 jour des modules<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>Pour mettre \u00e0 jour les modules il faut indiquer la commande suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">composer udpate<\/code><\/pre>\n\n\n\n<p>Ce qui donne :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">Loading composer repositories with package information\nUpdating dependencies\nNothing to modify in lock file\nInstalling dependencies from lock file (including require-dev)\nNothing to install, update or remove\nGenerating autoload files\n2 packages you are using are looking for funding.\nUse the `composer fund` command to find out more!<\/code><\/pre>\n\n\n\n<p>Dans  notre cas il n&rsquo;y a pas de mise \u00e0 jour effectu\u00e9e.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"II43_Trouver_des_modules\"><\/span>II.4.3 Trouver des modules<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>Il existe un entrepot dans lequel sont r\u00e9f\u00e9renc\u00e9s tous les modules sur le site suivant : <a rel=\"noreferrer noopener\" href=\"https:\/\/packagist.org\/\" target=\"_blank\">https:\/\/packagist.org\/<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"427\" src=\"http:\/\/blogperso.union31.fr\/wp-content\/uploads\/2021\/10\/packagist-1024x427.png\" alt=\"\" class=\"wp-image-2814\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2021\/10\/packagist-1024x427.png 1024w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2021\/10\/packagist-300x125.png 300w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2021\/10\/packagist-768x320.png 768w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2021\/10\/packagist.png 1234w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Tr\u00e8s utile pour trouver rapidement le bon \u00ab\u00a0require\u00a0\u00bb pour la bonne librairie&#8230;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"II44_Autres\"><\/span>II.4.4 Autres<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>Ne pas h\u00e9siter \u00e0 aller sur le site officiel.<\/p>\n\n\n\n<p>Une des pages interresante (parmi d&rsquo;autres \ud83d\ude42 ) concerne les commandes de composer : <a rel=\"noreferrer noopener\" href=\"https:\/\/getcomposer.org\/doc\/03-cli.md\" target=\"_blank\">lien<\/a>. On y trouvera notemment comment supprimer proprement un module et bien d&rsquo;autes choses interessantes dans le cadre de l&rsquo;automatisation de t\u00e9l\u00e9charemet des modules.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"III_Partie_PHP\"><\/span>III Partie PHP<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Nous allons voir maintenant comment utiliser ces modules dans PHP<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"III1_Autoload\"><\/span>III.1 Autoload<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"III11_LAutoload_par_defaut\"><\/span>III.1.1 L&rsquo;Autoload par d\u00e9faut<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>Composer fournit un mecanisme de chargement automatique des modules.<\/p>\n\n\n\n<p>Pour cela, dans le fichier index.php nous allons ajouter les lignes suivantes :<\/p>\n\n\n\n<p>Cela aura pour effet de charger automatiquement les classes des modules lorsqu&rsquo;elles seront utilis\u00e9es.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">&lt;?php\n\n# Charge l'autoloader de classes\nrequire __DIR__ . '\/prive\/vendor\/autoload.php';\n\n?&gt;<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"III12_Charger_ses_propres_classes\"><\/span>III.1.2 Charger ses propres classes<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>Pour charger ses propres classes et utiliser l&rsquo;autoloader fourni par slim il faut l&rsquo;indiquer dans le fichier \u00ab\u00a0composer.json\u00a0\u00bb<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">    \"autoload\": {\n        \"psr-4\": {\n            \"rappel_produit\\\\\": \"site\/\"\n             \n        }\n    },<\/code><\/pre>\n\n\n\n<p>Cela aura pour effet d&rsquo;aller chercher toutes les classes du r\u00e9pertoire site (et sous r\u00e9pertoires) pour le namespace \u00ab\u00a0rappel_produit\u00a0\u00bb.<\/p>\n\n\n\n<p>Attention, cela utilise la norme \u00ab\u00a0psr-4\u00a0\u00bb. Dans nore cas :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>les noms de fichiers commencent par une majuscule ;<\/li><li>les sous namspaces suivent les noms de r\u00e9pertoires physiques ;<\/li><li>les noms de classes ont une majuscule.<\/li><\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>Pour plus d&rsquo;info : <a rel=\"noreferrer noopener\" href=\"https:\/\/www.php-fig.org\/psr\/psr-4\/\" target=\"_blank\">https:\/\/www.php-fig.org\/psr\/psr-4\/<\/a><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"III2_Exemple_dutilisation_avec_module_SLIM4\"><\/span>III.2 Exemple d&rsquo;utilisation avec module SLIM4<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Le module SLIM4 permet de cr\u00e9er des applications web en utilisant le principe de REST. L&rsquo;exemple ci-dessous intercepte une requ\u00eate sur l&rsquo;URL \u00ab\u00a0\/\u00a0\u00bb et affiche un r\u00e9sultat.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">&lt;?php\n\n# Charge l'autoloader de classes\nrequire __DIR__ . '\/prive\/vendor\/autoload.php';\n\n# D\u00e9claration des classes \u00e0 utiliser\nuse Slim\\Psr7\\Request as Request;\nuse Slim\\Psr7\\Response as Response;\nuse Slim\\Factory\\AppFactory;\n\n\/\/ Cr\u00e9ation de l'app\n$app = AppFactory::create();\n\n\/\/ d\u00e9fintion de la route\n$app-&gt;get('\/',function(Request $request, Response $response, $args){\n    \/\/ cr\u00e9ation de la r\u00e9ponse\n    $response-&gt;getBody()-&gt;write(\"Bonjour ! Test d'utilisation du module SLIM 4\" );\n    \/\/ renvoie la r\u00e9ponse\n    return $response;\n});\n\n\n\/\/ On lance le tout ...\n$app-&gt;run();\n\n?&gt;<\/code><\/pre>\n\n\n\n<p>On lance un serveur php pour ce site en particulier. Ceci \u00e0 la racine de la structure en tapant la ligne de commande suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">php -S 127.0.0.1:8080 -t site<\/code><\/pre>\n\n\n\n<p>Puis on v\u00e9rifie avec un navigateur :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-style-default\"><img loading=\"lazy\" decoding=\"async\" width=\"725\" height=\"237\" src=\"http:\/\/blogperso.union31.fr\/wp-content\/uploads\/2021\/10\/test_slim4_composer.png\" alt=\"\" class=\"wp-image-2826\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2021\/10\/test_slim4_composer.png 725w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2021\/10\/test_slim4_composer-300x98.png 300w\" sizes=\"auto, (max-width: 725px) 100vw, 725px\" \/><\/figure>\n\n\n\n<p>Nous voyons que cela fonctionne.<\/p>\n\n\n\n<p>Ceci pour dire que l&rsquo;outil composer permet tr\u00e8s rapidement de t\u00e9l\u00e9charger des modules d\u00e9j\u00e0 existant et de mani\u00e8re tr\u00e8s simple au final. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Composer est un outil qui permet de g\u00e9rer les d\u00e9pendances pour un projet PHP. Il permet d&rsquo; automatiser l&rsquo;installation de modules ainsi que leurs mises \u00e0 jour. il permet \u00e9galement de cr\u00e9er ses propres packages et de les distribuer. Cela<\/p>\n","protected":false},"author":1,"featured_media":2837,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-2765","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-_dev"],"_links":{"self":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/2765","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2765"}],"version-history":[{"count":49,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/2765\/revisions"}],"predecessor-version":[{"id":3134,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/2765\/revisions\/3134"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/media\/2837"}],"wp:attachment":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2765"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2765"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2765"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}