On part à la chasse aux dd
, var_dump
et autres joyeusetés qui, sauf exception, n’ont a priori pas leur place en prod.
Écriture de notre propre règle
Dans notre article introductif de PHPStan, on évoquait la puissance de l’outil à analyser notre code. Ici, on va chercher à le personnaliser en créant notre règle dont la fonction sera de détecter les appels aux fonctions dd
, dump
et var_dump
La première étape va consister à déclarer le namespace Rules
dédié aux règles PHPStan dans notre fichier composer.json
afin de détacher les éléments d’analyses statiques du reste de notre code :
1"autoload-dev": {2 "psr-4": {3 "Tests\\": "tests/",4 "Rules\\": "rules/" 5 }6},
Ensuite, on va créer notre classe CatchVarDumperRule
dans le dossier rules
à la racine de notre projet :
1namespace Rules; 2 3use PhpParser\Node; 4use PHPStan\Rules\Rule; 5use PHPStan\Analyser\Scope; 6 7class CatchVarDumperRule implements Rule 8{ 9 public function getNodeType(): string10 {11 //12 }13 14 public function processNode(Node $node, Scope $scope): array15 {16 //17 }18}
Notre règle doit implémenter 2 méthodes pour fonctionner :
-
getNodeType
: définis le type de nœud à analyser -
processNode
: contient l’analyse de chaque nœud du type mentionné, retourne un tableau contenant les erreurs si la règle n’est pas respectée, sinon un tableau vide.
Pour notre besoin, ce qu’on va chercher à détecter, ce sont les appels à des fonctions, on va donc indiquer le type correspondant dans la méthode getNodeType
:
1public function getNodeType(): string2{3 return \PhpParser\Node\Expr\FuncCall::class; 4}
Dorénavant, on sait que les différents nœuds analysés dans la méthode processNode()
seront des appels de fonction. Il nous reste donc à y vérifier que la fonction appelée n’est pas parmi celles interdites, auquel cas on remonte un message d’erreur au moteur PHPStan :
1public function processNode(Node $node, Scope $scope): array 2{ 3 if (! $node->name instanceof \PhpParser\Node\Name) { 4 return []; 5 } 6 7 $functionName = $node->name->toString(); 8 9 if (in_array($functionName, ['dd', 'var_dump', 'dump'], true)) { 10 return [11 PHPStan\Rules\RuleErrorBuilde::message(12 sprintf('Method %s is prohibited', $functionName)13 )->build(),14 ];15 }16 17 return [];18}
Notre règle est prête à être utilisée, la dernière étape consiste à la déclarer dans le fichier de config phpstan.neon
à la racine de votre projet :
1rules:2 - Rules\CatchVarDumperRule
Enfin, on lance l’analyse et on croise les doigts :
1php vendor/bin/phpstan analyse app
Bonus : valider notre règle rapidement
Voici une petite astuce pour debug rapidement notre règle lors de son implémentation. Je vous propose d’écrire un fichier test.php
à la racine de votre projet qui va faire en sorte de provoquer l’erreur que vous souhaitez remonter via PHPStan.
Dans notre cas, on va faire des appels aux méthodes interdites, ainsi qu’à une méthode qui ne l’est pas :
1<?php2 3var_dump('yolo');4 5dump('No, you kidding ...');6 7rand(1, 10);8 9dd('yolo again');
On lance la commande en spécifiant le chemin vers notre fichier :
1php vendor/bin/phpstan analyse test.php
Et voici le résultat :
Encore mieux, si vous souhaitez capitaliser sur la bonne execution de vos règles, je vous invite à lire notre article sur l'implémentation de tests des règles PHPStan !
A lire
Autres articles de la même catégorie
Pourquoi Vite ne build pas ?
Un retour d'experience douloureux mais formateur sur le fonctionnement de Vite !
Mathieu De Gracia
Maîtrisez les relations belongs-to-many avec la méthode attach
Attardons nous sur les subtilités de la méthode attach
Mathieu De Gracia
Comment fonctionne Laravel Sanctum ?
Arrêtez de débugger vos SPA à l'aveugle et maîtrisez enfin les rouages de ce système d'authentification.
Laravel Jutsu