documentation
Kohinos v3 Doc générée le commit 8d60b1904

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.

À retenir

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

⚠ DBAL 4.x — refus catégorique

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 deprecations
(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"]
Pipeline d'upgrade en deux paliers (7.2 → 7.3, puis 7.3 → 7.4). Aucun saut direct.

Détail des étapes

  1. Audit deprecations : lancer le scan deprecations sur la base actuelle 7.2, traiter toutes les deprecations avant d'incrémenter la version.
  2. Upgrade composer.json : passer symfony/* à 7.3.*, garder doctrine/dbal en ^3.6.
  3. composer update symfony/* --with-dependencies — relire les changements de composer.lock ligne par ligne.
  4. Tests ciblés sur les composants modifiés. Jamais la suite complète.
  5. Validation manuelle Sonata Admin : créer/modifier un mandat SEPA, une transaction, un fonds SSA via le BackOffice.
  6. Tag intermédiaire git tag pre-sf74-upgrade avant de basculer 7.3 → 7.4.
  7. Répéter pour 7.3 → 7.4 avec la même rigueur.

5. Points d'attention par composant

5.1 Security

⚠ Tests fonctionnels 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, sinon LogicException.
  • .env.test doit contenir SECURE_SCHEME=http, sinon les access_control avec requires_channel: https redirigent en boucle.
  • Les firewalls par contexte (main, api, admin) restent inchangés mais leurs paramètres de session peuvent voir des setAttribute() dépréciés.
  • Vérifier les UserChecker custom — 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()
);

5.3 Form

5.4 Doctrine

⚠ Ne pas passer DBAL 4 — impact drivers

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.

5.5 API Platform 3.x

6. Procédure de vérification

⚠ À exécuter après chaque palier (7.2 → 7.3, puis 7.3 → 7.4)
# 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

⚠ Plan d'annulation — obligatoire avant tout upgrade
  1. Tag git avant upgrade : git tag pre-sf74-upgrade (et pour le palier intermédiaire pre-sf73-upgrade). Pousser le tag sur le remote self-hosted.
  2. 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).
  3. Versionner composer.lock : il doit être committé. Le rollback consiste à git checkout pre-sf74-upgrade -- composer.lock composer.json puis composer install.
  4. Cache prod : php bin/console cache:clear --env=prod + php bin/console cache:warmup --env=prod après rollback.
  5. Pas de migration Doctrine entre upgrade et rollback — si une migration a été jouée, la rejouer en migrate prev avant de redescendre les vendors.
  6. Vérifier les soldes via php bin/console kohinos:accounts:check aprè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.

PhaseDurée estiméeFenêtre autoriséeFenê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. —
⚠ Fenêtres interdites — non négociables
  • 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

Sources & liens