La stack technique du projet

Voici la stack technique que j'utilise pour ce projet. Beaucoup d'open-source évidemment, quoi d'autre ? 😜 Comme vous pouvez le voir, la base est une stack LAMP (Linux, Apache, MySQL, PHP) assez classique.
Comme j'ai déjà migré le projet en Symfony 5, vous êtes sûr que les bundles listés ici sont compatibles avec cette dernière version majeure du framework. Si vous commencez un projet de zéro, il est très important de choisir vos bundles avec précaution... ou vous pourriez le regrettez amèrement plus tard ! 😇

Les composants principaux

Nom Version Logo Remarques
Linux Ubuntu Server 18.04 LTS <b>L</b>inux C'est ma distribution Linux préférée. Stable, facile à utiliser et à maintenir. Ce serveur tourne depuis 4 ans et a été mis à jour de la 16.04 LTS à la 18.04 LTS.
Apache 2.4 <b>A</b>pache Je n'ai pas besoin de performance extraordinaires sur ce serveur donc Apache fait l'affaire comme serveur web. Il est stable et facile à configurer.
MySQL 5.7 <b>M</b>ySQL Je pense que MySQL vit ces dernièrs jours sur ce blog. J'ai prévu de le remplacer par PostgreSQL très bientôt.
PHP 8.3 <b>P</b>HP PHP n'est plus le vilain petit canard qu'il était il y a 15 ans. Il est désormais mature et son écosystème avec composer est fantastique. Pour avoir une version de PHP à jour, j'utilise les excellents dépôts d'Ondřej Surý.
Redis 5.0 Redis Magasin de données en mémoire que j'utilise ici comme cache ainsi que pour stocker les sessions PHP.
Symfony 6.4 Symfony Le framework PHP pour les professionnels.
Docker 19 Docker Incontournable Docker. Je l'utilise locallement pour avoir à disposition les services MySQL, Adminer, Elasticsearch, Elasticsearch Head, Kibana et Redis.

La stack front

Nom Logo Remarques
Vue.js Vue.js Vue.js est LE framework JavaScript progressif. Je joue sérieusement avec depuis 2020 et je dois dire qu'il est très impressionnant. Ça ouvre des possibilités infinies et change radicalement la façon dont on développe des sites web.
Yarn Yarn Yarn 🐱 est un gestionnaire de packages JavaScript et une alternative à NPM. Je voulais l'essayer, je n'ai pas été déçu. Il est plus rapide que NPM et fonctionne nativement avec un fichier .lock de telle sorte qu'on ait pas de mauvaises surprises lors de l'installation sur des serveurs différents.
Webpack Webpack Webpack empaquette vos assets: images, CSS et JavaScript de la manière la plus optimisée qui soit. Ce qui en fait un compagnon idéal pour Vue.js et l'ensemble de votre code JavaScript.
Material Kit Pro Material Kit Pro Material Kit est un framework HTML basé sur Bootstrap. Il me permet d'avoir un design propre sans avoir à produite du CSS personnalisé.

Les bundles Symfony

Je ne vais pas lister tous les composants que j'utilise ici. Jetez un coup d'œil au fichier complet composer.json ci-dessous pour avoir la liste exhaustive. Je peux peut-être mentionner le composant symfony/string car il est nouveau et n'est pas disponible pour Symfony 4. C'est l'une des raisons qui m'a poussé à migrer le blog rapidement vers Symfony 5 pour pouvoir utiliser ce puissant nouveau composant.

Nom Remarques
antishov/doctrine-extensions-bundle Fork de stof/doctrine-extensions-bundle compatible avec Symfony 5.
babdev/pagerfanta-bundle Fork de whiteoctober/WhiteOctoberPagerfantaBundle compatible avec Symfony 5.
doctrine/doctrine-bundle Bundle de l'ORM Doctrine.
doctrine/doctrine-fixtures-bundle Permet d'ajouter des fixtures de développement à la base de données.
easycorp/easyadmin-bundle Le générateur d'administration le plus facile à prendre en main pour Doctrine.
egulias/email-validator Pas vraiment un bundle mais cette librairie est nécessaire quand on utilise le mode strict du validateur email.
friendsofsymfony/elastica-bundle Intègre la librairie PHP Elastica dans un projet Symfony.
liip/imagine-bundle Fournit des fonctions de manipulation d'images.
mhujer/breadcrumbs-bundle Fork de whiteoctober/BreadcrumbsBundle compatible avec Symfony 5.
snc/redis-bundle Permet l'intégration de la librairie PHP predis dans une application Symfony.
lexik/jwt-authentication-bundle Permet de générer et de vérifier des jetons JWT. Jetez un coup œil à cet article.

Dev / DevOps / standards de code / analyse statique

Tout ce qui est listé ici correspond à la section require-dev du fichier composer.

Nom Remarques
api-platform/schema-generator Permet la génération d'un modèle de données à partir du vocabulaire schema.org.
easycorp/easy-deploy-bundle Le moyen le plus rapide de déployer une application Symfony sans interruption de service.
phpstan/phpstan Analyse statique pour trouver des erreurs dans le code sans même avoir à l'éxécuter.
phpstan/phpstan-symfony C'est le plugin Symfony pour PHPStan afin qu'il soit au fait du code spécifique à Symfony comme le conteneur d'injection de dépendances.
roave/security-advisories C'est une librairie que chaque projet se doit d'inclure. Elle permet de vérifier que votre application n'embarque pas de dépendances avec des failles de sécurité connues.
squizlabs/php_codesniffer Vérifie et corrige les coding standards de votre application.
hautelook/alice-bundle Chargement simplifié de données de développement (fixtures). Ce bundle vous rend la vie plus facile et vous fait gagner de nombreuses heures de travail.

Le fichier composer.json complet

Comme vous pouvez le voir, j'utilise un petit "hack" pour que je puisse utiliser mon fork du bundle FOSElasticaBundle au lieu de la version officielle. J'ai du faire ça car il n'est pas encore compatible avec Symfony 5 (ça ne saurait tarder).

{
    "name": "coil/strangebuzz",
    "description": "The Strangebuzz.com blog",
    "license": "proprietary",
    "type": "project",
    "require": {
        "php": ">=8.3",
        "ext-ctype": "*",
        "ext-curl": "*",
        "ext-dom": "*",
        "ext-filter": "*",
        "ext-gd": "*",
        "ext-iconv": "*",
        "ext-intl": "*",
        "ext-json": "*",
        "ext-libxml": "*",
        "ext-mbstring": "*",
        "ext-openssl": "*",
        "ext-pdo": "*",
        "ext-soap": "*",
        "ext-sodium": "*",
        "ext-zip": "*",
        "api-platform/core": "^3.0.0",
        "babdev/pagerfanta-bundle": "^4.0",
        "doctrine/annotations": "^1.0",
        "doctrine/cache": "^1.0",
        "doctrine/dbal": "^3.0",
        "doctrine/doctrine-bundle": "^2.6",
        "doctrine/orm": "~2.15.0",
        "easycorp/easy-deploy-bundle": "^1.1",
        "easycorp/easyadmin-bundle": "^4.6",
        "egulias/email-validator": "^3.0",
        "erusev/parsedown": "^1.7",
        "fresh/doctrine-enum-bundle": "^9.0",
        "hautelook/alice-bundle": "^2.8",
        "lexik/jwt-authentication-bundle": "^2.10",
        "liip/imagine-bundle": "^2.1",
        "meilisearch/meilisearch-php": "^1.1",
        "mhujer/breadcrumbs-bundle": "^1.5",
        "nelmio/cors-bundle": "^2.1",
        "nesbot/carbon": "^2.58",
        "nyholm/psr7": "^1.0",
        "pagerfanta/doctrine-collections-adapter": "^4.0",
        "pagerfanta/doctrine-orm-adapter": "^3.7",
        "pagerfanta/twig": "^4.0",
        "sensiolabs/ansi-to-html": "^1.1",
        "spipu/html2pdf": "^5.2",
        "stof/doctrine-extensions-bundle": "^1.4",
        "symfony/asset": "^6.0",
        "symfony/cache": "^6.0",
        "symfony/console": "^6.0",
        "symfony/dependency-injection": "^6.0",
        "symfony/dotenv": "^6.0",
        "symfony/error-handler": "^6.0",
        "symfony/expression-language": "^6.0",
        "symfony/flex": "^1.16",
        "symfony/form": "^6.0",
        "symfony/framework-bundle": "^6.0",
        "symfony/http-client": "^6.0",
        "symfony/http-kernel": "^6.0",
        "symfony/mime": "^6.0",
        "symfony/monolog-bundle": "^3.4",
        "symfony/process": "^6.0",
        "symfony/property-access": "^6.0",
        "symfony/property-info": "^6.0",
        "symfony/proxy-manager-bridge": "^6.0",
        "symfony/rate-limiter": "^6.0",
        "symfony/requirements-checker": "^2.0",
        "symfony/runtime": "^6.0",
        "symfony/security-bundle": "^6.0",
        "symfony/serializer": "^6.0",
        "symfony/stopwatch": "^6.0",
        "symfony/string": "^6.0",
        "symfony/thanks": "@stable",
        "symfony/twig-bundle": "^6.0",
        "symfony/uid": "^6.0",
        "symfony/validator": "^6.0",
        "symfony/web-link": "^6.0",
        "symfony/webpack-encore-bundle": "^1.7",
        "symfony/workflow": "^6.0",
        "symfony/yaml": "^6.0",
        "twig/extra-bundle": "^3.5",
        "twig/intl-extra": "^3.5",
        "twig/markdown-extra": "^3.0",
        "twig/twig": "^3.0"
    },
    "require-dev": {
        "dbrekelmans/bdi": "^1.0",
        "friendsofphp/php-cs-fixer": "@stable",
        "phpmetrics/phpmetrics": "^2.7",
        "phpstan/extension-installer": "^1.0",
        "phpstan/phpstan": "^1.5",
        "phpstan/phpstan-deprecation-rules": "^1.0",
        "phpstan/phpstan-doctrine": "^1.0",
        "phpstan/phpstan-strict-rules": "^1.1",
        "phpstan/phpstan-symfony": "^1.0",
        "phpunit/phpunit": "^9.5",
        "symfony/browser-kit": "^6.0",
        "symfony/css-selector": "^6.0",
        "symfony/debug-bundle": "^6.0",
        "symfony/maker-bundle": "^1.0",
        "symfony/panther": "^2.0",
        "symfony/phpunit-bridge": "^6.0",
        "symfony/var-dumper": "^6.0",
        "symfony/web-profiler-bundle": "^6.0",
        "zenstruck/browser": "^1.0"
    },
    "replace": {},
    "conflict": {
        "symfony/symfony": "*"
    },
    "repositories": {
        "strangebuzz/easy-deploy-bundle": {
            "type": "vcs",
            "url": "git@github.com:strangebuzz/easy-deploy-bundle.git"
        }
    },
    "minimum-stability": "beta",
    "prefer-stable": true,
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "App\\Tests\\": "tests/"
        }
    },
    "config": {
        "allow-plugins": {
            "phpstan/extension-installer": true,
            "symfony/flex": true,
            "symfony/thanks": true,
            "php-http/discovery": true,
            "symfony/runtime": true
        },
        "optimize-autoloader": true,
        "preferred-install": {
            "*": "dist"
        },
        "sort-packages": true
    },
    "extra": {
        "symfony": {
            "allow-contrib": false,
            "docker": true,
            "require": "6.4.*"
        }
    },
    "scripts": {
        "post-install-cmd": [
            "@auto-scripts"
        ],
        "post-update-cmd": [
            "@auto-scripts"
        ],
        "auto-scripts": {}
    }
}