meniloss/symfony-skeleton-shbyjm

Skeleton SHbyJM — base Symfony minimaliste pour tout nouveau site client, avec endpoint Flex SHbyJM pre-configure

Maintainers

Package info

github.com/meniloss/symfony-skeleton-shbyjm

Language:PowerShell

Type:project

pkg:composer/meniloss/symfony-skeleton-shbyjm

Statistics

Installs: 33

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.6.2 2026-05-20 15:55 UTC

This package is auto-updated.

Last update: 2026-05-20 19:56:48 UTC


README

Base Symfony minimaliste avec l'endpoint Flex SHbyJM pré-configuré. Aucun module SHbyJM n'est inclus par défaut — chaque package s'ajoute à la demande via composer require.

Prérequis

PHP

  • PHP >= 8.2 avec les extensions ctype et iconv
  • Composer 2.x

Authentification GitHub (repos privés)

Les packages SHbyJM (shbyjm/admin-shell, shbyjm/lead-forwarding, shbyjm/lead-management, shbyjm/cookie-consent, shbyjm/conversion-tracking) sont hébergés dans des repos privés meniloss/*. Composer doit disposer d'un token GitHub ayant accès à ces repos.

Configurer le fichier auth.json de Composer (global) :

composer config --global github-oauth.github.com ghp_VOTRE_TOKEN_GITHUB

Le token doit avoir le scope repo pour accéder aux dépôts privés de l'organisation meniloss.

Installation

composer create-project meniloss/symfony-skeleton-shbyjm mon-nouveau-site

Cela crée un projet Symfony 7.4 vierge avec :

  • L'endpoint Flex SHbyJM déjà configuré
  • Les repositories VCS GitHub déclarés pour les packages SHbyJM privés
  • La config Messenger SHbyJM (deux bus, middleware doctrine_transaction + DispatchDomainEventsAfterCommit, transport async Doctrine)
  • La locale fr et le timezone Europe/Brussels par défaut
  • Le Shared Kernel initial (Clock Port, EmailAddress, RecordsDomainEvents)

Structure dual avec bootstrap.ps1

Après la création du projet, le script bootstrap.ps1 réorganise la structure en séparant le code Symfony du webroot. C'est la structure attendue pour un déploiement sur PlanetHoster (ou tout hébergement où le webroot est un dossier distinct).

Utilisation typique

composer create-project meniloss/symfony-skeleton-shbyjm mon-nouveau-site
cd mon-nouveau-site
.\bootstrap.ps1
cd symfony
composer require shbyjm/admin-shell

Paramètres

Paramètre Défaut Description
-SymfonyDir symfony Nom du dossier contenant le code
-PublicDir public_html Nom du dossier webroot

Les noms peuvent contenir des points et des tirets (utile pour les sous-domaines PlanetHoster) :

.\bootstrap.ps1 -SymfonyDir "symfony" -PublicDir "blog.example.com.public_html"

Structure résultante

mon-nouveau-site/
├── symfony/              # Code Symfony (src/, config/, vendor/, bin/...)
├── public_html/          # Webroot (index.php, .htaccess, assets...)
├── claude.md             # Conventions projet
└── .git/

Le script ajuste automatiquement :

  • composer.jsonextra.symfony.public-dir pointe vers le webroot
  • composer.json → retrait de assets:install %PUBLIC_DIR% des auto-scripts (inutile avec Webpack Encore, incompatible avec la structure dual)
  • index.php → le require de l'autoloader pointe vers symfony/vendor/

Note : assets:install est retiré par convention SHbyJM. La stack utilise Webpack Encore pour la gestion des assets. Si un cas spécifique le nécessite, la commande reste disponible manuellement : php bin/console assets:install.

Apache (.htaccess)

Le skeleton tire symfony/apache-pack via flex-require. La recipe officielle pose automatiquement un .htaccess dans public/ au create-project. Apres bootstrap.ps1, ce fichier se retrouve dans public_html/.htaccess — pret pour un deploiement Apache (PlanetHoster N0C).

CSRF

Le skeleton livre config/packages/csrf.yaml qui desactive le CSRF stateless (double-submit cookie) introduit par la recipe Symfony 7.4. Tous les sites SHbyJM utilisent form_login via admin-shell, qui necessite le CSRF classique base session. Sans cette preemption, le login echoue avec "Jeton CSRF invalide".

Repositories VCS

Le composer.json déclare les repositories VCS GitHub des packages SHbyJM :

"repositories": [
    { "type": "vcs", "url": "https://github.com/meniloss/admin-shell" },
    { "type": "vcs", "url": "https://github.com/meniloss/lead-forwarding" },
    { "type": "vcs", "url": "https://github.com/meniloss/lead-management" },
    { "type": "vcs", "url": "https://github.com/meniloss/cookie-consent" },
    { "type": "vcs", "url": "https://github.com/meniloss/conversion-tracking" }
]

Ces déclarations indiquent à Composer où trouver les packages privés. Aucun package n'est installé automatiquement — ils restent à ajouter à la demande via composer require.

Config Messenger (livrée d'office)

Le skeleton inclut config/packages/messenger.yaml avec la convention Messenger partagée par tous les sites SHbyJM :

  • command.bus (synchrone) — middlewares doctrine_transaction + DispatchDomainEventsAfterCommitMiddleware, bus par défaut
  • async.bus — taches lourdes (emails, notifications differees)
  • Transport async — Doctrine, retry x3
  • Transport failed — dead-letter queue Doctrine

Cette config est une convention structurante documentee dans le claude.md. Tous les packages SHbyJM (admin-shell, lead-forwarding, lead-management, cookie-consent, conversion-tracking) en dependent. Elle est livree dans le skeleton plutot que via une recipe Flex car Flex refuse d'ecraser un fichier existant en mode non-interactif — la recipe officielle symfony/messenger pose un messenger.yaml par defaut avant que la recipe SHbyJM ne puisse agir.

La variable MESSENGER_TRANSPORT_DSN est definie dans le .env du skeleton.

Locale et timezone

Le skeleton livre config/packages/framework.yaml et config/packages/translation.yaml avec :

  • default_locale: 'fr' (convention SHbyJM — tous les sites sont francophones)
  • fallbacks: ['fr'] pour les traductions

Ces fichiers preemptent les recipes Flex officielles (meme mecanisme que messenger.yaml).

Shared Kernel

Le skeleton livre un src/Shared/ initial avec les classes transversales utilisees par tous les sites SHbyJM :

src/Shared/
+-- Application/Port/Clock/Clock.php            # Interface Clock (regle absolue #5)
+-- Domain/Event/RecordsDomainEvents.php         # Trait pour les aggregats
+-- Domain/ValueObject/EmailAddress.php          # VO immuable avec validation
+-- Infrastructure/Clock/SystemClock.php         # Implementation prod (symfony/clock)
+-- Infrastructure/Clock/FrozenClock.php         # Implementation test (temps fige)
+-- Infrastructure/Messenger/
    +-- DispatchDomainEventsAfterCommitMiddleware.php  # Dispatch events apres commit

Ces classes suivent les conventions documentees dans le claude.md (Clock Port obligatoire, Value Objects immuables, handlers retournant [result, events]).

Ajout des modules SHbyJM

Les recipes SHbyJM s'appliquent automatiquement grâce à l'endpoint Flex configuré dans ce skeleton. Il suffit de require les packages souhaités :

# Back-office
composer require shbyjm/admin-shell

# Transfert de leads
composer require shbyjm/lead-forwarding

Cinq packages SHbyJM disponibles (exemples ci-dessus parmi cette liste) : shbyjm/admin-shell (back-office), shbyjm/lead-forwarding (outbox vers le Hub), shbyjm/lead-management (CRM léger), shbyjm/cookie-consent (bandeau RGPD), shbyjm/conversion-tracking (Meta Pixel / CAPI / GA4).

Chaque composer require déclenche la recipe associée, qui met en place la configuration, les routes, les templates, etc.

Ajout de packages Symfony standards

Ce skeleton est volontairement minimal. Les packages courants (Doctrine, Twig, Mailer, Security, etc.) s'ajoutent de la même manière :

composer require doctrine/orm
composer require twig
composer require symfony/mailer

Endpoint Flex

Ce skeleton configure deux endpoints Flex (dans composer.json > extra.symfony.endpoint) :

  1. https://api.github.com/repos/meniloss/recipes/contents/index.json — recipes SHbyJM (admin-shell, lead-forwarding, lead-management, cookie-consent, conversion-tracking)
  2. flex://defaults — recipes officielles Symfony

L'ordre est important : les recipes SHbyJM sont consultées en priorité.