Composer.json : le manifeste du développeur moderne
5 min de lecture
Et maintenant, présentation officielle de mon fichier composer.json
(à la fin du billet). Oui, c’est ce fichier où on met tellement de trucs qu’on dirait un buffet à volonté : tu as pris trop de tout, tu peux plus bouger, ta ceinture va exploser comme ton bidou, mais tu regrettes rien.
Les indispensables, qu’on utilise même pas toujours
- PHP >=8.2 : Ouais, c’est récent, parce que coder sur une version antérieure en 2025, c’est comme écouter Bach en 2025 : possible, mais gênant (auto vanne). Sur ce projet, j’utilise PHP 8.4
- Doctrine ORM & Migrations : Parce que le SQL, on l’écrit plus, ça nous rend nostalgique des années 90. On préfère largement s’embrouiller avec des attributs pendant 4 heures.
- EasyAdminBundle : Faire une admin à la main ? Tu as vu la vierge en 4DX ?
- Symfony UX Live Component & Twig Component : Les composants React, mais version PHP, parce qu’on aime se compliquer la vie, mais juste un peu.
La sécurité, cette grande paranoïa moderne
- Scheb 2FA et TOTP : Parce qu’avec les hackers et les petits malins, le mot de passe « password123 », ça suffit plus.
- Nelmio Security Bundle : Ça filtre tellement bien qu’il pourrait filtrer cet ex toxique qui te fait skier. Hyper pratique !
- Karser reCaptcha3 : Pas Kärcher (ça c’est le kink de Sarko). Un truc de Google pour vérifier que t’es bien un humain : « Sarah Connor ? »
Utilitaires à usage très, très spécifique
- Endroid QR Code : Je suis sûr qu’un jour, quelqu’un va scanner ce QR Code… mais pas aujourd’hui. En vrai c’est pour générer un QR Code pour la double authentification, on en reparlera plus tard, sois pas impatient !
- HTMLPurifier : Le nettoyeur professionnel, la Cristina du HTML : « Ma chérie, ta balise est dégueulasse ! »
- Gedmo Doctrine Extensions : Les dates de création et modifications, slugs automatiques… bref, tout pour éviter de bosser pour de vrai.
- League CommonMark : Transformer du Markdown en HTML parce qu’écrire directement du HTML c’est trop mainstream.
La galaxie Symfony : ces bundles qu’on ajoute sans réfléchir (et parce-que sinon c’est pas un projet Symfony)
- Asset Mapper : parce-qu’ici on utilise du JavaScript moderne et qu’on n’a pas besoin de compiler, et surtout que ça fait du bien de mettre NodeJS au feu. Cœurs avec NPM.
- Rate Limiter & Lock : Limiter les abus parce qu’on est bienveillant, mais faut pas pousser mémé dans les orties.
- Serializer & Validator : Un peu comme les vigiles de boîte : « C’est pas conforme monsieur, tu rentres pas. »
- Monolog : C’est le psy du développeur. Ça écoute tous nos problèmes et erreurs critiques sans juger : ça tu le fais tout seul en te traitant de grosse tanche quand tu as ton écran avec du rouge.
- Dotenv : « Cacher ses secrets comme un agent secret », sauf que c’est juste ta clé API reCAPTCHA.
- TailwindBundle : Du CSS qui envoie du poney.
La famille Twig (ou comment éviter PHP dans les vues)
- Cache-Extra, Extra-Bundle, HTML-Extra, Intl-Extra : Si après tout ça, Twig rame encore, c’est qu'il est de Melun (j'ai le droit de dire, j'en viens).
Pour les vrais qui testent leur code (ou prétendent le faire)
- PHPUnit : Si ça passe pas ici, ça passera en prod, pas vrai ?
- Panther : Tester le JS avec du PHP, car la schizophrénie technologique, c’est mon projet.
- Doctrine Fixtures & FakerPHP : Fabriquer des fausses données, parce que demander à ton client des vraies données c’est tellement 2010.
- PHPStan, Psalm & Rector : Les flics du PHP. Toujours là pour te rappeler que tu fais tout mal, mais c’est pour ton bien.
- Roave Security Advisories : Celui-là, il râle dès que tu installes une librairie pourrie. Un vrai pote quoi.
- MakerBundle : Le générateur officiel de flemme.
- FriendsOfPHP CS Fixer : Parce que ton code est moche. Et oui, on parle bien du tien.
Polyfills à outrance
- Polyfill PHP72 à PHP82 : Parce que la rétrocompatibilité, c’est comme porter des baskets avec un costard : c’est pas beau, mais des fois, t’as pas le choix.
On arrive à la fin
Ce fichier composer.json
, c’est comme un gros sac à dos : t’y mets toute ta vie, ça pèse une tonne, mais si tu enlèves un truc, t’as l’impression qu’il te manque quelque chose d’essentiel.
L’intégralité du fichier en question :
{
"type": "project",
"license": "MIT",
"minimum-stability": "dev",
"prefer-stable": true,
"require": {
"php": ">=8.2",
"ext-ctype": "*",
"ext-dom": "*",
"ext-iconv": "*",
"ext-libxml": "*",
"ext-simplexml": "*",
"ext-xml": "*",
"doctrine/doctrine-bundle": "^2.10.2",
"doctrine/doctrine-migrations-bundle": "^3.2.4",
"doctrine/orm": "^3.0.1",
"easycorp/easyadmin-bundle": "^4.24",
"endroid/qr-code": "^6.0",
"ezyang/htmlpurifier": "^4.18",
"gedmo/doctrine-extensions": "^3.18",
"karser/karser-recaptcha3-bundle": "^0.2.1",
"league/commonmark": "^2.6",
"nelmio/security-bundle": "^3.4",
"scheb/2fa-bundle": "^7.6",
"scheb/2fa-totp": "^7.6",
"symfony/asset": "^7.2",
"symfony/asset-mapper": "^7.2",
"symfony/config": "^7.2",
"symfony/console": "^7.2",
"symfony/dotenv": "^7.2",
"symfony/expression-language": "^7.2",
"symfony/filesystem": "^7.2",
"symfony/flex": "*",
"symfony/form": "^7.2",
"symfony/framework-bundle": "^7.2",
"symfony/lock": "^7.2",
"symfony/monolog-bundle": "^3.8",
"symfony/property-access": "^7.2",
"symfony/property-info": "^7.2",
"symfony/rate-limiter": "^7.2",
"symfony/runtime": "^7.2",
"symfony/security-bundle": "^7.2",
"symfony/serializer": "^7.2",
"symfony/twig-bundle": "^7.2",
"symfony/ux-live-component": "^2.23",
"symfony/ux-twig-component": "^2.22",
"symfony/validator": "^7.2",
"symfony/web-link": "^7.2",
"symfony/yaml": "^7.2",
"symfonycasts/tailwind-bundle": "^0.8.0",
"twig/cache-extra": "*",
"twig/extra-bundle": "^2.12|^3.0",
"twig/html-extra": "^3.20",
"twig/intl-extra": "^3.20",
"twig/twig": "^2.12|^3.0"
},
"require-dev": {
"doctrine/doctrine-fixtures-bundle": "^4.0",
"fakerphp/faker": "^1.24",
"friendsofphp/php-cs-fixer": "^3.70",
"phpstan/extension-installer": "^1.4",
"phpstan/phpstan": "^2.1",
"phpstan/phpstan-doctrine": "^2.0",
"phpstan/phpstan-symfony": "^2.0",
"phpunit/phpunit": "^12.0",
"psalm/plugin-symfony": "^5.2",
"rector/rector": "^2.0",
"roave/security-advisories": "dev-latest",
"symfony/browser-kit": "^7.2",
"symfony/css-selector": "^7.2",
"symfony/debug-bundle": "^7.2",
"symfony/maker-bundle": "^1.51.1",
"symfony/panther": "^2.2",
"symfony/stopwatch": "^7.2",
"symfony/web-profiler-bundle": "^7.2",
"vimeo/psalm": "^6.8",
"weirdan/doctrine-psalm-plugin": "^2.10"
},
"config": {
"optimize-autoloader": true,
"preferred-install": {
"*": "dist"
},
"sort-packages": true,
"allow-plugins": {
"phpstan/extension-installer": true,
"symfony/flex": true,
"symfony/runtime": true
}
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"App\\Tests\\": "tests/"
}
},
"replace": {
"symfony/polyfill-ctype": "*",
"symfony/polyfill-iconv": "*",
"symfony/polyfill-php72": "*",
"symfony/polyfill-php73": "*",
"symfony/polyfill-php74": "*",
"symfony/polyfill-php80": "*",
"symfony/polyfill-php81": "*",
"symfony/polyfill-php82": "*"
},
"scripts": {
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install": "symfony-cmd",
"importmap:install": "symfony-cmd"
},
"post-install-cmd": [
"@auto-scripts"
],
"post-update-cmd": [
"@auto-scripts"
]
},
"conflict": {
"symfony/symfony": "*"
},
"extra": {
"symfony": {
"allow-contrib": true,
"require": "^7.2",
"docker": true
}
}
}