Stratégie de montée vers Symfony 7.4 LTS
Kohinos tourne actuellement sur Symfony 7.2.* et cible explicitement Symfony 7.4 LTS. Cette page documente le chemin d'upgrade : pourquoi 7.4, pré-requis Doctrine/DBAL, étapes versionnées, points d'attention par composant (Security, Sonata Admin, Form, API Platform), procédure de vérification et rollback. La règle cardinale : jamais en période de cycle SEPA/SSA actif, jamais de saut de minor non testé, jamais de DBAL 4.x. La montée est étalée sur plusieurs semaines, minor par minor, en respectant strictement les priorités projet (intégrité financière > souveraineté > sobriété > maintenabilité > performance).
1. Pourquoi 7.4 LTS
Symfony 7.4 est la version LTS du cycle 7.x. Pour une infrastructure monétaire communautaire auto-hébergée, c'est le bon choix : on minimise la fréquence des upgrades intrusives, on capitalise sur du long terme stabilisé, et on s'aligne avec la roadmap PHP 8.4.
- 3 ans de bugfixes + 4 ans de correctifs de sécurité à compter de la sortie de la LTS — couvre largement la prochaine fenêtre de stabilité Kohinos.
- PHP 8.4 stabilisé : property hooks, asymmetric visibility, lazy objects compatibles avec Doctrine ORM 2.x.
- Sobriété : moins de mises à jour majeures imposées dans les 2-3 ans à venir, ce qui colle à la priorité n°3 du projet (low-tech, Raspberry Pi friendly).
- Sécurité : la branche LTS reçoit les CVE patchs en priorité, alignée avec la politique de souveraineté (priorité n°2).
- Écosystème : Sonata Admin 4.x, API Platform 3.x et Doctrine ORM 2.14+ sont compatibles Symfony 7.4.
L'upgrade vers 7.4 LTS n'est pas une obligation calendaire : tant que 7.2 est encore maintenu, on prend le temps de la sécuriser. Mais on ne dépasse jamais la fin de vie de 7.2 sans avoir migré — cela violerait la priorité n°1 (intégrité financière) en exposant le projet à des CVE non patchées.
2. État actuel vs cible
Inventaire des composants critiques pour Kohinos (gestion eMLc,
mandats SEPA, redistribution SSA, notifications mailer). Les versions
actuelles sont celles déclarées dans composer.json.
| Composant | Version actuelle (7.2.*) | Cible (7.4 LTS) | Usage Kohinos |
|---|---|---|---|
symfony/framework-bundle |
7.2.* | 7.4.* | Cœur applicatif, kernel, DI. |
symfony/http-foundation |
7.2.* | 7.4.* | Request, sessions, cookies. Sensible aux changements Cookie::create(). |
symfony/form |
7.2.* | 7.4.* | Formulaires SEPA, dons, mandats, gestion adhérents. Vérifier les types renvoyés par getData(). |
symfony/security-bundle |
7.2.* | 7.4.* | Auth multi-rôles (super_admin, trésorier, adhérent, prestataire, comptoir). access_control + requires_channel. |
symfony/mailer |
7.2.* | 7.4.* | FluxNotificationService, SepaNotificationService. SMTP self-host. |
symfony/messenger |
7.2.* | 7.4.* | Notifications asynchrones, traitements SEPA différés. |
symfony/twig-bundle |
7.2.* | 7.4.* | Rendu templates themes/kohinos/. |
sonata-project/admin-bundle |
4.x | 4.x (compat 7.4) | BackOffice trésorier / super_admin. |
api-platform/core |
3.x | 3.x (compat 7.4) | API expose adhérents / opérations (lecture seule). |
doctrine/orm |
2.14+ | 2.14+ (pas 3.x dans ce cycle) | ORM. Le saut 2 → 3 sera un chantier séparé. |
doctrine/dbal |
3.x | 3.x (bloqué — pas 4.x) | Driver MariaDB / SQLite. DBAL 4 change Schema et Platform. |
3. Pré-requis
- PHP ≥ 8.2 — Kohinos tourne déjà en 8.4 en dev, pré-requis satisfait sans action.
- Doctrine ORM ≥ 2.14, < 3 — la cible reste 2.x pour ce cycle d'upgrade. Le saut ORM 3 est un chantier indépendant qui exigera la réécriture des
EntityManagermocks dans les tests. - DBAL 3.x verrouillé — DBAL 4 modifie
Schema::createTable(), supprimegetName()sur les plateformes et change la signature des drivers. Cela impacterait directementApp\Utils\MigrationFactoryDecoratoret les guards de plateforme dans les migrations. - Composer ≥ 2.6 pour la résolution moderne des conflits transitifs.
- Environnement de test fonctionnel :
SECURE_SCHEME=httpdans.env.test, SQLite in-memory configurable,app:init-test-database --env=test --purgeopérationnel. - PHPStan baseline propre avant upgrade — sinon les nouvelles erreurs SF 7.4 seront noyées.
doctrine/dbal:^4.0 est interdit dans
composer.json. Le passage casse :
Doctrine\DBAL\Platforms\AbstractPlatform::getName()
(utilisé dans nos guards de migration SQLite/MariaDB), la signature
Schema::createTable(), et les drivers PDO custom. La
contrainte doit rester "doctrine/dbal": "^3.6" tant que
le projet n'a pas planifié de chantier dédié.
4. Plan d'upgrade par étapes
La montée se fait minor par minor, jamais en saut direct 7.2 → 7.4. Chaque palier est validé indépendamment avant le suivant. Aucune étape n'est optionnelle.
flowchart LR A["1. Audit deprecationsPipeline d'upgrade en deux paliers (7.2 → 7.3, puis 7.3 → 7.4). Aucun saut direct.
(SF 7.2 actuel)"] --> B["2. Upgrade composer.json
vers 7.3.*"] B --> C["3. Migration micro-version
7.2 → 7.3"] C --> D["4. Tests ciblés
(jamais phpunit complet)"] D --> E["5. Validation manuelle
Sonata Admin + Form"] E --> F["6. Tag git intermédiaire
pre-sf74-upgrade"] F --> G["7. Upgrade composer.json
vers 7.4.*"] G --> H["8. Migration micro-version
7.3 → 7.4"] H --> I["9. Tests ciblés + routes
(financier, SEPA, SSA)"] I --> J["10. Merge sur master"]
Détail des étapes
- Audit deprecations : lancer le scan deprecations sur la base actuelle 7.2, traiter toutes les deprecations avant d'incrémenter la version.
- Upgrade
composer.json: passersymfony/*à7.3.*, garderdoctrine/dbalen^3.6. composer update symfony/* --with-dependencies— relire les changements decomposer.lockligne par ligne.- Tests ciblés sur les composants modifiés. Jamais la suite complète.
- Validation manuelle Sonata Admin : créer/modifier un mandat SEPA, une transaction, un fonds SSA via le BackOffice.
- Tag intermédiaire
git tag pre-sf74-upgradeavant de basculer 7.3 → 7.4. - Répéter pour 7.3 → 7.4 avec la même rigueur.
5. Points d'attention par composant
5.1 Security
createClient()ne peut être appelé qu'une seule fois par classe de test.AbstractFunctionalTestCase::setUp()l'appelle déjà — ne pas le rappeler ensuite, sinonLogicException..env.testdoit contenirSECURE_SCHEME=http, sinon lesaccess_controlavecrequires_channel: httpsredirigent en boucle.- Les firewalls par contexte (
main,api,admin) restent inchangés mais leurs paramètres de session peuvent voir dessetAttribute()dépréciés. - Vérifier les
UserCheckercustom — la signature peut évoluer entre minors.
5.2 Sonata Admin 4.x
Sonata Admin 4 reste compatible Symfony 7.4 mais conserve ses breaking changes 4.x déjà présents. Rappels critiques à ne pas régresser pendant l'upgrade :
// ❌ Sonata Admin 3.x — n'existe plus en 4.x
$this->trans('label.key', [], 'admin');
// ✅ Sonata Admin 4.x
$this->getTranslator()->trans(
'label.key',
[],
$this->getTranslationDomain()
);
DatagridMapperestfinal— impossible à mocker. Tests admin →markTestIncomplete()ou integration test sur kernel réel.ProxyQueryInterfacen'expose plusgetRootAlias()niandWhere()directement : accès via__callsur le QueryBuilder interne.- Mocks d'admins :
getMockBuilder(X::class)->disableOriginalConstructor()->onlyMethods([...]). - Vérifier les overrides de
configureFormFields()— les types de champs Sonata peuvent voir des deprecations renforcées en 7.4.
5.3 Form
- Les types Money custom (
MoneyType+ transformerBigDecimal) doivent être audités :getData()renvoie selon les versions unstring,floatou objet. Jamais comparer en===. - Les
CollectionTypepour mandats SEPA et items SSA peuvent voir leur comportementallow_add/by_referenceévoluer. - Les
ChoiceTypeavec enums PHP 8.1+ : vérifier quechoice_valuerenvoie bien levaluedu backed enum. - Les form events (
PRE_SUBMIT,POST_SET_DATA) restent stables mais les contraintes d'ordre peuvent changer.
5.4 Doctrine
DBAL 4 supprime AbstractPlatform::getName(), change la
signature des Driver et impose les Schema
via une nouvelle API. Nos guards de migration
(if ($platform === 'mysql')) cesseraient de fonctionner,
et App\Utils\MigrationFactoryDecorator casserait à l'init
du container. Verrouiller
"doctrine/dbal": "^3.6" dans composer.json.
- Doctrine ORM reste en 2.14+. Pas de migration 2 → 3 dans ce cycle.
- Le mapping
type: attributereste obligatoire — pas d'annotations docblock. - Vérifier que
doctrine/doctrine-bundlereste compatible Symfony 7.4 sans imposer DBAL 4. - Tester
doctrine:schema:validateaprès chaque upgrade — doit rester sans warning.
5.5 API Platform 3.x
- API Platform 3.x déclare une compatibilité Symfony 6.4 / 7.x — vérifier explicitement la borne supérieure dans
composer.jsondu paquet installé. - Les
ApiResourceattributes restent inchangés. - Les serializers custom (notamment pour
SepaMandateavec IBAN masqué) doivent être re-testés. - Surveiller la doc OpenAPI générée : un changement de structure peut casser un client externe.
6. Procédure de vérification
# 1. Mise à jour des dépendances
composer update symfony/* --with-dependencies
# 2. Vérifier le schéma Doctrine — doit rester clean
php bin/console doctrine:schema:validate
# 3. Analyse statique — pas de nouvelle suppression PHPStan
vendor/bin/phpstan analyze src tests
# 4. Tests ciblés FINANCIER / SEPA / SSA
# Jamais `vendor/bin/phpunit` complet — bloqué par settings.json
vendor/bin/phpunit --testsuite=sepa
vendor/bin/phpunit --testsuite=ssa
vendor/bin/phpunit tests/Service/Flux/
vendor/bin/phpunit tests/Service/Account/
# 5. Détection des 500 multi-rôles
# Prérequis : symfony server:start + pip3 install requests
python3 scripts/test-routes.py --only-errors
python3 scripts/test-routes.py --role super_admin --only-errors
python3 scripts/test-routes.py --role tresorier --only-errors
# 6. Lints Symfony
php bin/console lint:yaml config
php bin/console lint:twig templates
# 7. Container — vérifier qu'il compile sans warning
php bin/console cache:clear --env=prod
php bin/console debug:container --deprecations
Critère de passage : tous les points ci-dessus doivent être verts. Une seule régression bloque le palier — on revient au tag git précédent.
7. Rollback
- Tag git avant upgrade :
git tag pre-sf74-upgrade(et pour le palier intermédiairepre-sf73-upgrade). Pousser le tag sur le remote self-hosted. - Backup DB complet avant exécution du palier en prod :
mysqldump --single-transaction --routines --triggers kohinos > backup-pre-sf74-$(date +%F).sql. Vérifier l'intégrité du dump (head+tail). - Versionner
composer.lock: il doit être committé. Le rollback consiste àgit checkout pre-sf74-upgrade -- composer.lock composer.jsonpuiscomposer install. - Cache prod :
php bin/console cache:clear --env=prod+php bin/console cache:warmup --env=prodaprès rollback. - Pas de migration Doctrine entre upgrade et rollback — si une migration a été jouée, la rejouer en
migrate prevavant de redescendre les vendors. - Vérifier les soldes via
php bin/console kohinos:accounts:checkaprès rollback : aucun écart toléré.
8. Calendrier proposé
Aucune pression calendaire. La règle est d'étaler la montée pour minimiser le risque sur les flux financiers en cours.
| Phase | Durée estimée | Fenêtre autorisée | Fenêtre interdite |
|---|---|---|---|
| Audit deprecations 7.2 | 1-2 semaines | N'importe quand (pas de modif runtime). | — |
| Palier 7.2 → 7.3 | 2-3 semaines | Jours 11-24 d'un mois calendaire. | 1-10 (cycle SEPA actif) · 25-fin de mois (cycle SSA actif). |
| Stabilisation 7.3 | 2-4 semaines | Observation prod, pas de modif intrusive. | — |
| Palier 7.3 → 7.4 LTS | 2-3 semaines | Jours 11-24 d'un mois calendaire. | 1-10 (cycle SEPA actif) · 25-fin de mois (cycle SSA actif). |
| Stabilisation 7.4 + ajustements | 2-4 semaines | Observation prod. | — |
- Jours 1-10 du mois : exécution des prélèvements SEPA mensuels (
kohinos:sepa:process-monthly). Aucun upgrade vendor. - Jours 25-fin de mois : exécution SSA (
kohinos:ssa:execute) et calcul des redistributions. Aucun upgrade vendor. - Si un cycle est en cours et qu'un palier traîne, on attend le mois suivant. La priorité n°1 (intégrité financière) prime toujours sur la dette technique.
Pour aller plus loin
composer.json— contraintes de version actuelles.composer.lock— versionné, point de rollback.docs/migration/RAPPORT_MIGRATION_SF74.md— historique migration SF4 → SF7, repères pour SF 7.4.doc/TROUBLESHOOTING.md— erreurs fréquentes post-migration SF7.- Décisions d'architecture (ADR)
- Migrations Doctrine
- Sonata Admin 4.x
- Tests & qualité
- Conventions PHP & Doctrine