Chapitre 14.6 — CS Fixer & Rector
Partie 14 : Tests & qualité — Chapitre 6/7 Version de référence : PHP CS Fixer 3 / Rector 2 / Symfony 7.4.
⏱️ TL;DR
- PHP CS Fixer applique un style de code cohérent (PSR-12 + règles Symfony) et le corrige automatiquement — fini les débats de mise en forme.
- Rector effectue des transformations sémantiques automatisées : montées de version PHP/Symfony, modernisation, améliorations de qualité — à l’échelle du projet.
- Différence : CS Fixer = style (espaces, ordre des imports…) ; Rector = sémantique (transformer du code, pas juste le reformater).
- Rector est l’outil clé pour migrer (Symfony 5→7, PHP 8.2→8.4 — cf. Partie 16).
- En CI, on les lance en mode vérification (
--dry-run) : le build échoue si le code n’est pas conforme.- Pour un dev Next.js : CS Fixer ≈ Prettier (+ ESLint stylistique), Rector ≈ des codemods (jscodeshift) — mais avec des règles prêtes pour les upgrades.
🎯 Objectifs
- Configurer et lancer CS Fixer.
- Configurer Rector et appliquer des règles.
- Distinguer style et transformation sémantique.
- Intégrer ces outils en CI.
1. PHP CS Fixer : le style
Un style cohérent évite les débats et les diffs pollués par la mise en forme. PHP CS Fixer applique un ensemble de règles et corrige le code.
composer require --dev friendsofphp/php-cs-fixer// .php-cs-fixer.dist.php
$finder = (new PhpCsFixer\Finder())->in(__DIR__ . '/src')->in(__DIR__ . '/tests');
return (new PhpCsFixer\Config())
->setRules([
'@PSR12' => true,
'@Symfony' => true, // le style officiel Symfony
'declare_strict_types' => true, // impose declare(strict_types=1)
'ordered_imports' => true,
'no_unused_imports' => true,
])
->setFinder($finder);Deux modes :
vendor/bin/php-cs-fixer fix # CORRIGE le code
vendor/bin/php-cs-fixer fix --dry-run --diff # VÉRIFIE (CI) : montre ce qui ne va pas, sans modifierEn local, on corrige ; en CI, on vérifie (--dry-run) et le build échoue si le style n’est pas respecté.
💡 Pour un dev Next.js : CS Fixer ≈ Prettier + les règles stylistiques d’ESLint, mais avec un preset
@Symfonyofficiel. On le branche souvent en pre-commit hook (comme Prettier) pour formater avant de committer. Le résultat : un code uniforme dans toute l’équipe, des diffs propres.
2. Rector : la transformation sémantique
Là où CS Fixer reformate, Rector transforme le code : il comprend l’AST (arbre syntaxique) et applique des règles qui changent la sémantique — par exemple convertir une syntaxe ancienne en moderne, ou adapter du code à une nouvelle version.
composer require --dev rector/rector// rector.php
use Rector\Config\RectorConfig;
use Rector\Set\ValueObject\LevelSetList;
use Rector\Symfony\Set\SymfonySetList;
return RectorConfig::configure()
->withPaths([__DIR__ . '/src', __DIR__ . '/tests'])
->withPhpSets(php84: true) // modernise vers PHP 8.4
->withSets([
SymfonySetList::SYMFONY_74, // adaptations Symfony 7.4
LevelSetList::UP_TO_PHP_84,
])
->withPreparedSets(codeQuality: true, deadCode: true); // qualité + code mortvendor/bin/rector process --dry-run # PRÉVISUALISE les changements
vendor/bin/rector process # APPLIQUEExemples de ce que Rector fait automatiquement :
- convertir des tableaux
array()en[]; - transformer une classe en promotion de constructeur (chapitre 2.5) ;
- remplacer une API dépréciée par son remplaçant (crucial pour les migrations) ;
- ajouter des types de retour manquants ;
- supprimer du code mort.
3. L’outil de migration : Rector pour les upgrades
Rector est l’ outil pour monter de version sans tout réécrire à la main. Migrer un projet de Symfony 5 → 6 → 7 (votre cas, cf. Partie 16) ou de PHP 8.1 → 8.4 : on applique les sets correspondants, et Rector transforme le code automatiquement (annotations → attributs, API dépréciées → remplaçants, etc.).
C’est ce qui rend la promesse de rétrocompatibilité (Partie 1.2) actionnable : Rector automatise le gros du travail de suppression des dépréciations. On revient sur la migration Symfony 5→7 en Partie 16.
⚠️ Piège : Rector modifie votre code — toujours l’exécuter sur un dépôt propre (rien de non-committé), en
--dry-rund’abord, puis relire le diff et lancer les tests. Une transformation automatique peut se tromper sur un cas tordu. Rector fait 90 % du travail ; vous validez les 10 % (relecture + tests verts). Ne jamaisrector processpuis committer sans regarder.
4. CS Fixer vs Rector : complémentaires
| PHP CS Fixer | Rector | |
|---|---|---|
| Agit sur | le style (mise en forme) | la sémantique (structure/logique) |
| Exemple | ordre des imports, espaces | annotations → attributs, upgrade version |
| Réversible sans risque | oui (pur formatage) | à relire (transformation réelle) |
| Usage clé | uniformité du code | migrations & modernisation |
On les utilise ensemble : Rector transforme, CS Fixer met en forme le résultat. Les deux tournent en CI (dry-run) et souvent en pre-commit.
✏️ Exercices
Exercice 1. Quelle commande CS Fixer utilise-t-on en local vs en CI, et pourquoi ?
✅ Solution
Local : vendor/bin/php-cs-fixer fix (il corrige le code avant de committer). CI : vendor/bin/php-cs-fixer fix --dry-run --diff (il vérifie sans modifier ; le build échoue si du code n’est pas conforme). Ainsi, on formate en local et la CI garantit que rien de mal formé n’est mergé.
Exercice 2. Vous devez migrer un projet de Symfony 6 / PHP 8.1 vers Symfony 7.4 / PHP 8.4. Quel outil et quelles précautions ?
✅ Solution
Rector, avec les sets Symfony 7.x et PHP 8.4 (annotations→attributs, API dépréciées→remplaçants, modernisation). Précautions : partir d’un dépôt propre (rien de non-committé), lancer d’abord en --dry-run pour prévisualiser, puis relire le diff et exécuter les tests (verts) avant de committer. Rector automatise l’essentiel ; on valide manuellement les cas particuliers.
Exercice 3. Quelle est la différence fondamentale entre CS Fixer et Rector ?
✅ Solution
CS Fixer agit sur le style (mise en forme : espaces, ordre des imports, declare(strict_types)…) — purement cosmétique, sans risque. Rector agit sur la sémantique : il transforme le code (structure, API, version), ce qui change réellement le comportement/la forme du code et doit être relu. En bref : CS Fixer reformate, Rector refactore.
🧠 Quiz de révision
1. Que fait PHP CS Fixer ?
Il applique et corrige automatiquement un style de code cohérent (PSR-12 + @Symfony), pour un code uniforme.
2. Que fait Rector de plus ?
Des transformations sémantiques (upgrades PHP/Symfony, modernisation, code mort) — il change le code, pas juste sa mise en forme.
3. Quel outil pour migrer Symfony 6 → 7.4 ?
Rector (sets Symfony + PHP), en --dry-run puis relecture + tests.
4. Comment les lance-t-on en CI ?
En mode vérification (--dry-run) : le build échoue si le code n’est pas conforme (CS Fixer) ou modifiable par Rector.
5. Quelle précaution avec Rector ?
L’exécuter sur un dépôt propre, en dry-run d’abord, puis relire le diff et lancer les tests — il modifie réellement le code.
Prochain chapitre : 14.7 — CI GitHub Actions — automatiser tests et qualité sur chaque PR.