Vous souhaitez nous soutenir ? Devenez sponsor de l'association sur notre page Github
Tutoriels

PHPStan : Il est où dd() ?

William Suppo avatar
Publié le 12 décembre 2024
Couverture de l'article PHPStan : Il est où dd() ?

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(): string
10 {
11 //
12 }
13 
14 public function processNode(Node $node, Scope $scope): array
15 {
16 //
17 }
18}

Notre règle doit implémenter 2 méthodes pour fonctionner :

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(): string
2{
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<?php
2 
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 :

image.png

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