The project stack

Here is the technical stack I use on this project. Lots of open-source of course, what else? 😜 As you can see, the base is a LAMP stack (Linux, Apache, MySQL, PHP).
As I have already migrated the project to Symfony 5, you are sure that the bundles listed here support it. This is very important if you start a project from scratch. Choose your bundles very wisely... or it could turn into a nightmare later! πŸ˜‡

The main components

Name Version Logo Notes
Linux Ubuntu Server 18.04 LTS <b>L</b>inux It's is my preferred Linux distribution. Stable, easy to use and maintain.
Apache 2.4 <b>A</b>pache I don't need extra performance so Apache is OK as the web server. It's stable and easy to configure.
MySQL 5.7 <b>M</b>ySQL I think MySQL lives its last days on this blog. I am planning to switch to PostgreSQL soon.
PHP 8.3 <b>P</b>HP PHP isn't the "ugly" and mocked language it was 15 years ago anymore. It is now mature and it's ecosystem with composer is amazing. To have the latest PHP version, I use the excellent repositories of OndΕ™ej SurΓ½.
Redis 5.0 Redis In-memory data structure store I use here as a cache system and to store PHP sessions.
Symfony 6.4 Symfony The PHP framework for professionals.
Docker 19 Docker Unmissable Docker. I used it locally to have at my disposal the MySQL, Adminer, Elasticsearch, Elasticsearch Head, Kibana and Redis services.

The frontend stack

Name Logo Notes
Vue.js Vue.js Vue.js is THE Progressive JavaScript Framework. I am seriously playing with it since 2020, and it I must say it's impressive. It opens infinite possibilities and radically changes the way you develop websites.
Yarn Yarn Yarn is a JavaScript package manager and an alternative to NPM. I wanted to give a try, and I'm not disappointed. It's faster than NPM and works with a .lock file, so you don't have surprises when installing the package on different servers.
Webpack Webpack Webpack bundles your assets: images, CSS and JavasSript in the most optimized possible way. It makes it the perfect companion for Vue.js and all your JavaScript code.
Material Kit Pro Material Kit Pro Material Kit is an excellent HTML framework based on Bootstrap. It allows me to have a clean design without creating custom CSS.

The Symfony bundles

I won't list here all the Symony components I use. Check out the full composer.json file below to have the exhaustive list. Perhaps I can mention the symfony/string because it's new and it's not available for Symfony 4. This is one of the main reason I wanted the blog to be upgraded to Symfony 5 so I can use this new powerful component.

Name Notes
antishov/doctrine-extensions-bundle Fork of stof/doctrine-extensions-bundle that is compatible with Symfony 5.
babdev/pagerfanta-bundle Fork of whiteoctober/WhiteOctoberPagerfantaBundle that is compatible with Symfony 5.
doctrine/doctrine-bundle Bundle for all the Doctrine ORM stuff.
doctrine/doctrine-fixtures-bundle Allows to load development fixtures in the database.
easycorp/easyadmin-bundle The most easy to use admin generator for Doctrine.
egulias/email-validator Not a bundle but allows to use the strict mode when using the Symfony email validator.
friendsofsymfony/elastica-bundle Integrates the PHP Elastica library in your Symfony project.
liip/imagine-bundle Provides an image manipulation abstraction toolkit.
mhujer/breadcrumbs-bundle Fork of whiteoctober/BreadcrumbsBundle that is compatible with Symfony 5.
snc/redis-bundle Integrates the PHP predis library in your Symfony application.
lexik/jwt-authentication-bundle Allows to generate and verify JWT token. Check out this article.

Dev / DevOps / coding standards / static analysis

All is listed here corresponds to the require-dev section of the composer file.

Name Notes
api-platform/schema-generator Generates a PHP data model from the vocabulary.
easycorp/easy-deploy-bundle Easiest way to deploy your Symfony application without downtime.
phpstan/phpstan Static code analysis to find errors in your code without actually running it.
phpstan/phpstan-symfony It's the Symfony plugin for PHPStan so it's aware of specific Symfony stuff like the dependency injection container.
roave/security-advisories This is a library every project should contain. It ensures that your application doesn't have installed dependencies with known security vulnerabilities.
squizlabs/php_codesniffer Check and fix the PHP coding standards of your application.
hautelook/alice-bundle Fixtures loading make easy. This bundle make your life easier and will save you a lot of hours of work.

The full composer.json file

As you can see there is a little "hack", so I can use my fork of the FOSElasticaBundle instead of the official one. I had to do this because the official bundle is not compatible yet with Symfony 5.

    "name": "coil/strangebuzz",
    "description": "The 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": ""
    "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": [
        "post-update-cmd": [
        "auto-scripts": {}