You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: content/blog/claude-assistant-architecture-symfony-legacy.mdx
+17-17Lines changed: 17 additions & 17 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,16 +4,16 @@ date: "2026-03-09"
4
4
updatedAt: "2026-03-26"
5
5
author: "Louis-Arnaud Catoire"
6
6
category: "IA"
7
-
excerpt: "Comment configurer Claude Code avec un CLAUDE.md qui encode tes conventions d'archi hexagonale, tes règles DDD et tes patterns Doctrine."
7
+
excerpt: "Comment configurer Claude Code avec un CLAUDE.md qui encode vos conventions d'archi hexagonale, vos règles DDD et vos patterns Doctrine."
8
8
image: "/images/blog/claude-symfony.webp"
9
9
proficiencyLevel: "Expert"
10
10
---
11
11
12
-
Tu ouvres Claude Code sur ton projet Symfony. Tu lui demandes de créer un use case. Il te génère un service avec 15 dépendances, des annotations Doctrine dans le domaine, et un contrôleur de 200 lignes. Exactement ce que tu passes tes journées à corriger en code review. Et sur un projet legacy, cette [dette technique accumulée](/article/la-dette-technique-faut-il-vraiment-en-avoir-peur) ne fait que s'aggraver si l'IA la reproduit.
12
+
Vous ouvrez Claude Code sur votre projet Symfony. Vous lui demandez de créer un use case. Il vous génère un service avec 15 dépendances, des annotations Doctrine dans le domaine, et un contrôleur de 200 lignes. Exactement ce que vous passez vos journées à corriger en code review. Et sur un projet legacy, cette [dette technique accumulée](/article/la-dette-technique-faut-il-vraiment-en-avoir-peur) ne fait que s'aggraver si l'IA la reproduit.
13
13
14
-
Le problème n'est pas Claude. C'est que Claude ne connaît pas ton architecture. Il génère du code Symfony "standard" parce que c'est ce qu'il a vu le plus souvent. Quand il s'agit de [reprise de projet Symfony](/reprise-projet-symfony), ce décalage entre le code généré et l'architecture existante est encore plus problématique. Ton archi hexagonale, tes conventions DDD, tes règles sur les repositories Doctrine : il ne les connaît pas tant que tu ne les lui expliques pas.
14
+
Le problème n'est pas Claude. C'est que Claude ne connaît pas votre architecture. Il génère du code Symfony "standard" parce que c'est ce qu'il a vu le plus souvent. Quand il s'agit de [reprise de projet Symfony](/reprise-projet-symfony), ce décalage entre le code généré et l'architecture existante est encore plus problématique. Votre archi hexagonale, vos conventions DDD, vos règles sur les repositories Doctrine : il ne les connaît pas tant que vous ne les lui expliquez pas.
15
15
16
-
La solution s'appelle `CLAUDE.md`. Un fichier à la racine de ton projet que Claude Code lit automatiquement à chaque session. C'est ton onboarding permanent. Et bien configuré, il transforme Claude en assistant qui respecte ton archi dès la première ligne de code.
16
+
La solution s'appelle `CLAUDE.md`. Un fichier à la racine de votre projet que Claude Code lit automatiquement à chaque session. C'est votre onboarding permanent. Et bien configuré, il transforme Claude en assistant qui respecte votre archi dès la première ligne de code.
17
17
18
18
## Le CLAUDE.md minimal qui change tout
19
19
@@ -54,9 +54,9 @@ Avec ces dix lignes, Claude arrête de générer des contrôleurs-services et co
54
54
55
55
## Encoder les conventions Doctrine
56
56
57
-
Doctrine est le point de friction numéro un entre Claude et ton archi. Par défaut, Claude traite les entités Doctrine comme des modèles domaine. Il colle des `#[ORM\Column]` partout et appelle `$entityManager->flush()` depuis les use cases.
57
+
Doctrine est le point de friction numéro un entre Claude et votre archi. Par défaut, Claude traite les entités Doctrine comme des modèles domaine. Il colle des `#[ORM\Column]` partout et appelle `$entityManager->flush()` depuis les use cases.
58
58
59
-
Ajoute une section dédiée dans ton`CLAUDE.md` :
59
+
Ajoutez une section dédiée dans votre`CLAUDE.md` :
60
60
61
61
```markdown
62
62
## Doctrine
@@ -90,9 +90,9 @@ L'exemple concret est important. Claude apprend mieux par l'exemple que par la r
90
90
91
91
Le DDD mal appliqué par un assistant IA donne du code pire que pas de DDD du tout. Des Value Objects partout sans raison, des Aggregates qui n'agrègent rien, des Domain Events qui ne servent à personne.
92
92
93
-
Si tu as un projet legacy à faire évoluer, un [guide de migration structuré](/article/guide-de-migration-dans-un-projet-symfony) aide à définir les étapes avant même de configurer l'IA.
93
+
Si vous avez un projet legacy à faire évoluer, un [guide de migration structuré](/article/guide-de-migration-dans-un-projet-symfony) aide à définir les étapes avant même de configurer l'IA.
94
94
95
-
Sois prescriptif sur ce que tu utilises vraiment :
95
+
Soyez prescriptif sur ce que vous utilisez vraiment :
Avec ces conventions, quand tu demandes à Claude "crée le use case pour annuler une commande", il génère un `CancelOrder` avec un `__invoke`, qui prend un `OrderId` en paramètre, appelle un port, et dispatche un `OrderCancelled`. Sans que tu aies à le guider ligne par ligne.
124
+
Avec ces conventions, quand vous demandez à Claude "crée le use case pour annuler une commande", il génère un `CancelOrder` avec un `__invoke`, qui prend un `OrderId` en paramètre, appelle un port, et dispatche un `OrderCancelled`. Sans que vous ayez à le guider ligne par ligne.
125
125
126
126
## Les patterns de test
127
127
128
-
Si tu ne dis rien sur les tests, Claude va générer des tests d'intégration avec `KernelTestCase`, une base de données SQLite, et des fixtures Doctrine. Sur un projet legacy, c'est exactement ce que tu essaies d'éliminer.
128
+
Si vous ne dites rien sur les tests, Claude va générer des tests d'intégration avec `KernelTestCase`, une base de données SQLite, et des fixtures Doctrine. Sur un projet legacy, c'est exactement ce que vous essayez d'éliminer.
Claude va maintenant générer un `InMemoryProductRepository` quand tu lui demandes des tests, au lieu de monter toute la stack Symfony.
153
+
Claude va maintenant générer un `InMemoryProductRepository` quand vous lui demandez des tests, au lieu de monter toute la stack Symfony.
154
154
155
155
## Les hooks Claude Code pour automatiser les vérifications
156
156
@@ -171,7 +171,7 @@ Un hook simple avec [Deptrac](https://github.com/qossmic/deptrac) qui vérifie l
171
171
}
172
172
```
173
173
174
-
À chaque fois que Claude modifie ou crée un fichier, Deptrac vérifie que les règles de dépendances sont respectées. Si un use case importe une classe Doctrine, le hook le signale immédiatement. Claude corrige avant même que tu aies lu le code.
174
+
À chaque fois que Claude modifie ou crée un fichier, Deptrac vérifie que les règles de dépendances sont respectées. Si un use case importe une classe Doctrine, le hook le signale immédiatement. Claude corrige avant même que vous ayez lu le code.
175
175
176
176
Combine ça avec PHPStan :
177
177
@@ -233,19 +233,19 @@ Quand Claude travaille dans `src/Order/`, il charge automatiquement ces règles
233
233
234
234
### Ne pas écrire un roman
235
235
236
-
Un `CLAUDE.md` de 1000 lignes est contre-productif. Claude a une fenêtre de contexte limitée. Chaque ligne de `CLAUDE.md` consomme des tokens qui ne sont plus disponibles pour ton code. Sois concis. Une règle par ligne. Pas d'explications philosophiques sur pourquoi le DDD c'est bien.
236
+
Un `CLAUDE.md` de 1000 lignes est contre-productif. Claude a une fenêtre de contexte limitée. Chaque ligne de `CLAUDE.md` consomme des tokens qui ne sont plus disponibles pour votre code. Soyez concis. Une règle par ligne. Pas d'explications philosophiques sur pourquoi le DDD c'est bien.
237
237
238
238
### Ne pas oublier les exemples
239
239
240
-
Les règles abstraites sont ambiguës. "Utilise des Value Objects" peut donner n'importe quoi. Un exemple concret de Value Object tel que tu le veux dans ton projet élimine toute ambiguïté. Mets un exemple par pattern clé : un use case, un repository, un mapper, un test.
240
+
Les règles abstraites sont ambiguës. "Utilise des Value Objects" peut donner n'importe quoi. Un exemple concret de Value Object tel que vous le voulez dans votre projet élimine toute ambiguïté. Mets un exemple par pattern clé : un use case, un repository, un mapper, un test.
241
241
242
242
### Ne pas figer les prompts système
243
243
244
-
Le `CLAUDE.md` évolue avec ton projet. Quand l'équipe adopte une nouvelle convention, elle met à jour le `CLAUDE.md` dans la même PR. Traite-le comme du code : il est versionné, reviewé, et maintenu. Les [conventions de codage PHP et Symfony](/article/coding-conventions) constituent un bon point de départ pour définir le socle de règles à encoder.
244
+
Le `CLAUDE.md` évolue avec votre projet. Quand l'équipe adopte une nouvelle convention, elle met à jour le `CLAUDE.md` dans la même PR. Traitez-le comme du code : il est versionné, reviewé, et maintenu. Les [conventions de codage PHP et Symfony](/article/coding-conventions) constituent un bon point de départ pour définir le socle de règles à encoder.
245
245
246
246
### Ne pas ignorer les cas limites du legacy
247
247
248
-
Ton projet legacy a des exceptions. Des services qui ne suivent pas l'archi hexagonale parce qu'on n'a pas eu le temps de les migrer. Documente-les :
248
+
Votre projet legacy a des exceptions. Des services qui ne suivent pas l'archi hexagonale parce qu'on n'a pas eu le temps de les migrer. Documentez-les :
249
249
250
250
```markdown
251
251
## Legacy (ne pas migrer)
@@ -257,7 +257,7 @@ Ne pas les refactorer sauf demande explicite :
257
257
- App\Entity\Legacy\*
258
258
```
259
259
260
-
Sans ça, Claude va essayer de refactorer ton code legacy en archi hexagonale à chaque fois qu'il le touche. Et tu vas passer plus de temps à annuler ses modifications qu'à avancer.
260
+
Sans ça, Claude va essayer de refactorer votre code legacy en archi hexagonale à chaque fois qu'il le touche. Et vous allez passer plus de temps à annuler ses modifications qu'à avancer.
Copy file name to clipboardExpand all lines: content/blog/commandes-invocables-symfony-attributs-console.mdx
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -343,7 +343,7 @@ Si vous avez un projet Symfony en production, cette tendance est un signal clair
343
343
344
344
-[Migrer du Serializer vers JsonStreamer : le guide honnête](/article/migrer-du-serializer-vers-json-streamer-le-guide-honnete) : une autre refonte majeure de Symfony 7.3+
345
345
-[Symfony Messenger comme colonne vertébrale d'une archi hexagonale](/article/symfony-messenger-colonne-vertebrale-archi-hexagonale) : combinez commandes invocables et Messenger pour vos workers
346
-
-[Pourquoi ton Domain ne devrait jamais connaître Symfony](/article/domain-ne-devrait-jamais-connaitre-symfony) : les DTOs `#[MapInput]` s'inscrivent dans cette philosophie
346
+
-[Pourquoi votre Domain ne devrait jamais connaître Symfony](/article/domain-ne-devrait-jamais-connaitre-symfony) : les DTOs `#[MapInput]` s'inscrivent dans cette philosophie
347
347
-[Les certifications Symfony, Twig & Sylius](/article/les-certifications-symfony-twig-symfony-sylius) : la Console fait partie de l'examen
348
348
-[Documentation officielle : Console Commands](https://symfony.com/doc/current/console.html) : la référence Symfony
349
349
-[PR originale : Invokable commands](https://github.com/symfony/symfony/pull/61748) : la PR de Kevin Bond qui a lancé le mouvement
0 commit comments