Forum

Avez vous des règles personnalisées pour PHPStan ?

William Suppo avatar
Publié le 17 janvier 2023
Par William Suppo

Coucou la commu,

Tout d'abord je vous souhaite une merveilleuse année, que vos projets se réalisent !

Le tweet de Ludo (@NordCoders) au sujet de la pluralisation ou non de nos contrôleurs m'a fait repenser à la vidéo de Frédéric Bouchery sur son utilisation de phpunit pour vérifier les règles de conception de son équipe.

Et cela m'a donné l'idée d'en faire une, avec PHPStan, qui vérifiera que les contrôleurs sont au pluriel.

A noter que c'est un choix d'équipe et pas nécessairement une bonne pratique. D'ailleurs, je commence à être adepte du "Single Action Controller", qui signifie dédier un contrôleur à une unique tache.

Bref, c'était l'occasion de jouer avec PHPStan dont voici la règle en question :

1namespace Rules;
2 
3use Illuminate\\Support\\Str;
4use PhpParser\\Node;
5use PHPStan\\Rules\\Rule;
6use PHPStan\\Analyser\\Scope;
7 
8class PluralControllerNameRule implements Rule
9{
10 public function getNodeType(): string
11 {
12 return \\PHPStan\\Node\\InClassNode::class;
13 }
14 
15 public function processNode(Node $node, Scope $scope): array
16 {
17 if (! str_starts_with($scope->getNamespace(), 'App\\Http\\Controllers')) {
18 return [];
19 }
20 
21 $reflectionClass = $node->getClassReflection();
22 
23 // ex: App\Http\Controllers\UserController
24 $fullName = $reflectionClass->getName();
25 
26 if ($fullName === 'App\\Http\\Controllers\\Controller') {
27 return [];
28 }
29 
30 // Extraction du nom de la classe sans le suffixe, ex: User
31 $name = Str::of($fullName)->match('/(\\w+)Controller$/')->value();
32 
33 if ($name !== Str::pluralStudly($name)) {
34 return [
35 "Controllers should be in plural form, expected '" . Str::pluralStudly($name) . "Controller'"
36 ];
37 }
38 
39 return [];
40 }
41}

Vous remarquerez que j'utilise la classe Str de Laravel pour me simplifier la vie.

Et vous ? Avez-vous des règles de PHPStan dédiées à vos besoins ?

Ciao

3 réponses
Mathieu De Gracia, Il y a 1 an

Hi,

C'est top, Arkitect pouvait également répondre à ce besoin mais de manière moins précise, sans avoir accès à l'arbre syntaxique !

Cela peut être conjugué avec les baselines pour mettre sous le tapis toutes les erreurs actuelles ?

William Suppo, Il y a 1 an

J'avoue ne pas avoir testé mais j'image que oui avec une conf semblable à celle ci :

1parameters:
2 ignoreErrors:
3 -
4 message: "#^Controllers should be in plural form, expected .*Controller.$#"
5 count: 1
6 path: app/Http/Controllers
Mathieu De Gracia, Il y a 1 an

Bien que Arkitect soit grandement paramétrable, j'aime bien ce que propose phpstan là, ca me semble plus complet.