Skip to content

Commit ceea7b3

Browse files
authored
update (#614)
1 parent 903bf48 commit ceea7b3

11 files changed

+190
-190
lines changed

content/blog/claude-assistant-architecture-symfony-legacy.mdx

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ date: "2026-03-09"
44
updatedAt: "2026-03-26"
55
author: "Louis-Arnaud Catoire"
66
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."
88
image: "/images/blog/claude-symfony.webp"
99
proficiencyLevel: "Expert"
1010
---
1111

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.
1313

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.
1515

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.
1717

1818
## Le CLAUDE.md minimal qui change tout
1919

@@ -54,9 +54,9 @@ Avec ces dix lignes, Claude arrête de générer des contrôleurs-services et co
5454

5555
## Encoder les conventions Doctrine
5656

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.
5858

59-
Ajoute une section dédiée dans ton `CLAUDE.md` :
59+
Ajoutez une section dédiée dans votre `CLAUDE.md` :
6060

6161
```markdown
6262
## Doctrine
@@ -90,9 +90,9 @@ L'exemple concret est important. Claude apprend mieux par l'exemple que par la r
9090

9191
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.
9292

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.
9494

95-
Sois prescriptif sur ce que tu utilises vraiment :
95+
Soyez prescriptif sur ce que vous utilisez vraiment :
9696

9797
```markdown
9898
## DDD
@@ -121,11 +121,11 @@ Nommage : verbe + nom → CreateOrder, ValidateInvoice, GetProduct
121121
Toujours une seule méthode publique __invoke().
122122
```
123123

124-
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.
125125

126126
## Les patterns de test
127127

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.
129129

130130
```markdown
131131
## Tests
@@ -150,7 +150,7 @@ tests/
150150
│ └── DoctrineProductRepositoryTest.php # KernelTestCase
151151
```
152152

153-
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.
154154

155155
## Les hooks Claude Code pour automatiser les vérifications
156156

@@ -171,7 +171,7 @@ Un hook simple avec [Deptrac](https://github.com/qossmic/deptrac) qui vérifie l
171171
}
172172
```
173173

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.
175175

176176
Combine ça avec PHPStan :
177177

@@ -233,19 +233,19 @@ Quand Claude travaille dans `src/Order/`, il charge automatiquement ces règles
233233

234234
### Ne pas écrire un roman
235235

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.
237237

238238
### Ne pas oublier les exemples
239239

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.
241241

242242
### Ne pas figer les prompts système
243243

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.
245245

246246
### Ne pas ignorer les cas limites du legacy
247247

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 :
249249

250250
```markdown
251251
## Legacy (ne pas migrer)
@@ -257,7 +257,7 @@ Ne pas les refactorer sauf demande explicite :
257257
- App\Entity\Legacy\*
258258
```
259259

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.
261261

262262
## Le résultat en pratique
263263

content/blog/commandes-invocables-symfony-attributs-console.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ Si vous avez un projet Symfony en production, cette tendance est un signal clair
343343

344344
- [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+
345345
- [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
347347
- [Les certifications Symfony, Twig & Sylius](/article/les-certifications-symfony-twig-symfony-sylius) : la Console fait partie de l'examen
348348
- [Documentation officielle : Console Commands](https://symfony.com/doc/current/console.html) : la référence Symfony
349349
- [PR originale : Invokable commands](https://github.com/symfony/symfony/pull/61748) : la PR de Kevin Bond qui a lancé le mouvement

0 commit comments

Comments
 (0)