-
Retour d'expérience et bonnes pratiques
Projet client BtoB
- Code vieux de 10 ans
- Pas de framework
- Pas de POO
- Pas de test...
Refonte progressive vs refonte "one shot"
Coté legacy : Session PHP
Coté Symfony : Débrancher système par défaut
Entry Point
ERP Authenticator
Legacy Session Bridge
Legacy Session Storage
PHP Session
Legacy
Symfony
Documentation : https://symfony.com/blog/new-in-symfony-4-4-password-migrations
Tout nouveau code sur Symfony
Déprécier le legacy
Refondre petit à petit le legacy
- Page plus rapide
- Moins de connexions à la base de données
- Moins de consommation CPU / RAM
- ...
KPI pour le suivi d'avancement de la refonte pour l'équipe et la direction
Pré-nettoyage : fichier inutile et problème de directory structure
Vision sur la charge de travail de la refonte
Parcourir l'application et sauvegarder les rendus
Mettre en place un filet de sécurité
On ouvre une URL
On récupère le contenu de la requête
Si snapshot non existant, création de celui-ci
Si snapshot existant, génération d'un diff
Si diff alors test en erreur
Rector : Automatisation migration PHP
Php Stan : Analyse de code statique
Php cs fixer : Correction présentation de code
Automatiser les outils
Analyse la qualité à chaque changement de code
Encapsuler les règles métiers
Mutualiser les règles métiers
Composition de règles
if A
if B
if A || B
...
IsA
IsB
IsA or IsB
Ajouter du comportement sur les règles métiers
Chaîne de responsabilité avec plusieurs règles
if A
then a
if B
then b
Rule Engine
IsARule
When IsA
Then a
IsBRule
When IsB
Then b
Historiser les processus critiques
Logger l'entrée & sortie d'un processus
Retracer en cas d'erreur
IsARule
When IsA
Then a
12-05-23 15:01:59 rule.a.start { "foo": "bar" }
12-05-23 15:02:00 rule.a.success
12-05-23 15:02:01 rule.b.start { "foo": "bar" }
12-05-23 15:02:05 rule.b.error { "reason": "because ..." }IsBRule
When IsB
Then b
Cloisonner la logique dans des contextes métiers
S'aider du métier pour définir les contextes critiques
Action : Point d'entrée d'une requête
Domain : Logique métier
Responder : Traite le rendu de la réponse
Distingue les opérations de lecture et d'écriture
Query pour la lecture, Command pour l'écriture
Approches techniques différentes
Cloisonner le code par contexte métier
Développement en couche : ADR et CQRS
Beaucoup d'abstraction pour les implémentations techniques
Fixe une solution technique à un problème
Adhésion aux nouvelles pratiques, implémentation
Transmission des connaissances
Symfony Maker
Développer c'est tester
Couverture sur les aspects critiques
Tests fonctionnels avec Behat
1 - Lister tous les problèmes de l'application
2 - Définir une stratégie et des objectifs
3 - Faire un inventaire de l'application
4 - Mettre en place un Golden Master
5 - Mettre des outils d'analyse de code
6 - Implémenter des Design Pattern et des architectures
7 - Consolider les choix avec des ADR et du Pair programming
8 - Tester !
Dépend du projet
Dépend de l'équipe
Besoin de stratégie qui répond au contexte
Lead développeur Akawaka