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 7.4 <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 5.2 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.
Elasticsearch 6.8 Elasticsearch Vous savez, pour la recherche. Ne manquez pas mon tutoriel en trois parties : Implémenter un moteur de recherche avec Elasticsearch et Symfony.

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 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).

{
    "type": "project",
    "license": "proprietary",
    "name": "coil/strangebuzz",
    "description": "Strangebuzz.com blog",
    "minimum-stability": "beta",
    "prefer-stable": true,
    "repositories": {
        "coil_foselasticabundle": {
            "type": "vcs",
            "url": "git@github.com:COil/FOSElasticaBundle.git"
        }
    },
    "require": {
        "php": ">=7.4.0",
        "ext-ctype": "*",
        "ext-dom": "*",
        "ext-filter": "*",
        "ext-gd": "*",
        "ext-iconv": "*",
        "ext-json": "*",
        "ext-mbstring": "*",
        "ext-pdo": "*",
        "ext-curl": "*",
        "antishov/doctrine-extensions-bundle": "^1.4",
        "api-platform/core": "^2.6",
        "babdev/pagerfanta-bundle": "^2.1",
        "composer/package-versions-deprecated": "1.11.99.1",
        "doctrine/annotations": "^1.0",
        "doctrine/doctrine-bundle": "^2",
        "doctrine/doctrine-fixtures-bundle": "^3.0",
        "doctrine/doctrine-migrations-bundle": "^3.0",
        "doctrine/orm": "^2",
        "easycorp/easy-deploy-bundle": "^1.0",
        "easycorp/easyadmin-bundle": "^3.0",
        "egulias/email-validator": "^3.0",
        "erusev/parsedown": "^1.7",
        "fresh/doctrine-enum-bundle": "^7.1",
        "friendsofsymfony/elastica-bundle": "v5.1.3",
        "hautelook/alice-bundle": "^2.8",
        "lexik/jwt-authentication-bundle": "^2.10",
        "liip/imagine-bundle": "^2.1",
        "mhujer/breadcrumbs-bundle": "^1.5",
        "nelmio/cors-bundle": "^2.1",
        "phpdocumentor/reflection-docblock": "^5.2",
        "predis/predis": "^1.0",
        "ramsey/uuid-doctrine": "^1.6",
        "sensio/framework-extra-bundle": "^6.0",
        "sensiolabs/ansi-to-html": "^1.1",
        "snc/redis-bundle": "~3.0",
        "symfony/asset": "^5.2",
        "symfony/cache": "^5.2",
        "symfony/console": "^5.2",
        "symfony/dotenv": "^5.2",
        "symfony/error-handler": "^5.2",
        "symfony/expression-language": "^5.2",
        "symfony/flex": "^1.3",
        "symfony/form": "^5.2",
        "symfony/framework-bundle": "^5.2",
        "symfony/http-client": "^5.2",
        "symfony/http-kernel": "^5.2",
        "symfony/mime": "5.2.*",
        "symfony/monolog-bundle": "^3.4",
        "symfony/process": "^5.2",
        "symfony/property-access": "5.2.*",
        "symfony/property-info": "5.2.*",
        "symfony/rate-limiter": "5.2.*",
        "symfony/requirements-checker": "^2.0",
        "symfony/security-bundle": "^5.2",
        "symfony/serializer": "5.2.*",
        "symfony/stopwatch": "5.2.*",
        "symfony/string": "^5.2",
        "symfony/thanks": "^1.1",
        "symfony/twig-bundle": "^5.2",
        "symfony/validator": "^5.2",
        "symfony/web-link": "^5.2",
        "symfony/webpack-encore-bundle": "^1.7",
        "symfony/yaml": "^5.2",
        "twig/extra-bundle": "^2.12|^3.0",
        "twig/markdown-extra": "^3.0",
        "twig/twig": "^2.12|^3.0"
    },
    "require-dev": {
        "brianium/paratest": "^6.1",
        "dbrekelmans/bdi": "^0.3.0",
        "ekino/phpstan-banned-code": "^0.3.1",
        "friendsofphp/php-cs-fixer": "^2.16",
        "justinrainbow/json-schema": "^5.2",
        "phpstan/extension-installer": "^1.0",
        "phpstan/phpstan-deprecation-rules": "^0.12.5",
        "phpstan/phpstan-doctrine": "^0.12.33",
        "phpstan/phpstan-strict-rules": "^0.12.9",
        "phpstan/phpstan-symfony": "^0.12",
        "phpunit/phpunit": "^9.5",
        "roave/security-advisories": "dev-latest",
        "symfony/browser-kit": "^5.2",
        "symfony/css-selector": "^5.2",
        "symfony/debug-bundle": "5.2.*",
        "symfony/maker-bundle": "^1.0",
        "symfony/panther": "^1.0",
        "symfony/phpunit-bridge": "^5.2",
        "symfony/var-dumper": "5.2.*",
        "symfony/web-profiler-bundle": "5.2.*",
        "zenstruck/browser": "^0.4.0"
    },
    "config": {
        "optimize-autoloader": true,
        "preferred-install": {
            "*": "dist"
        },
        "sort-packages": true,
        "platform": {
            "php": "7.4"
        }
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "App\\Tests\\": "tests/"
        }
    },
    "replace": {
        "symfony/polyfill-iconv": "*",
        "symfony/polyfill-php71": "*",
        "symfony/polyfill-php70": "*",
        "symfony/polyfill-php56": "*"
    },
    "conflict": {
        "symfony/symfony": "*"
    },
    "extra": {
        "symfony": {
            "allow-contrib": true,
            "require": "5.2.*"
        }
    },
    "scripts": {
        "auto-scripts": {
        },
        "post-install-cmd": [
            "@auto-scripts"
        ],
        "post-update-cmd": [
            "@auto-scripts"
        ]
    }
}