2
2
3
3
[ ![ Downloads] ( https://img.shields.io/packagist/dt/symplify/phpstan-rules.svg?style=flat-square )] ( https://packagist.org/packages/symplify/phpstan-rules/stats )
4
4
5
- Set of rules for PHPStan used by Symplify projects
6
-
7
- - See [ Rules Overview] ( docs/rules_overview.md )
5
+ Set of 35 custom PHPStan rules that check architecture, typos, class namespace locations, accidental visibility override and more. Useful for any type of PHP project, from legacy to modern stack.
8
6
9
7
<br >
10
8
@@ -18,7 +16,7 @@ composer require symplify/phpstan-rules --dev
18
16
19
17
<br >
20
18
21
- ## 1 . Add Prepared Sets
19
+ ## A . Add Prepared Sets
22
20
23
21
Sets are bunch of rules grouped by a common area, e.g. improve naming. You can pick from 5 sets:
24
22
@@ -30,20 +28,9 @@ includes:
30
28
- vendor/symplify/phpstan-rules/config/static-rules.neon
31
29
` ` `
32
30
33
- Add sets one by one, fix what you find useful and ignore the rest.
34
-
35
- <br>
36
-
37
- Do you write custom [Rector](http://github.com/rectorphp/rector-src) rules? Add rules for them too:
38
-
39
- ` ` ` yaml
40
- includes :
41
- - vendor/symplify/phpstan-rules/config/rector-rules.neon
42
- ` ` `
43
-
44
31
<br>
45
32
46
- ## 2 . Cherry-pick Configurable Rules
33
+ ## B . Cherry-pick Configurable Rules
47
34
48
35
There is one set with pre-configured configurable rules. Include it and see what is errors are found:
49
36
@@ -55,7 +42,7 @@ includes:
55
42
56
43
<br>
57
44
58
- Would you like to ** tailor it to fit your taste** ? Pick one PHPStan rule and configure it manually ↓
45
+ Would you like to tailor it to fit your taste? Pick one PHPStan rule and configure it manually ↓
59
46
60
47
` ` ` yaml
61
48
services :
@@ -74,14 +61,16 @@ services:
74
61
75
62
<br>
76
63
77
- <!-- ruledoc-start -->
78
64
# 30 Rules Overview
79
65
80
66
## AnnotateRegexClassConstWithRegexLinkRule
81
67
82
68
Add regex101.com link to that shows the regex in practise, so it will be easier to maintain in case of bug/extension in the future
83
69
84
- - class: [` Symplify\PHPStanRules\Rules\AnnotateRegexClassConstWithRegexLinkRule`](../src/Rules/AnnotateRegexClassConstWithRegexLinkRule.php)
70
+ ` ` ` yaml
71
+ rules :
72
+ - Symplify\PHPStanRules\Rules\AnnotateRegexClassConstWithRegexLinkRule.php)
73
+ ` ` `
85
74
86
75
` ` ` php
87
76
class SomeClass
@@ -112,7 +101,10 @@ class SomeClass
112
101
113
102
Interface must be located in "Contract" or "Contracts" namespace
114
103
115
- - class : [`Symplify\PHPStanRules\Rules\CheckRequiredInterfaceInContractNamespaceRule`](../src/Rules/CheckRequiredInterfaceInContractNamespaceRule.php)
104
+ ``` yaml
105
+ rules :
106
+ - Symplify\PHPStanRules\Rules\CheckRequiredInterfaceInContractNamespaceRule
107
+ ` ` `
116
108
117
109
` ` ` php
118
110
namespace App\Repository;
@@ -144,8 +136,6 @@ Class should have suffix "%s" to respect parent type
144
136
145
137
:wrench : ** configure it!**
146
138
147
- - class : [`Symplify\PHPStanRules\Rules\ClassNameRespectsParentSuffixRule`](../src/Rules/ClassNameRespectsParentSuffixRule.php)
148
-
149
139
``` yaml
150
140
services :
151
141
-
@@ -182,7 +172,10 @@ class SomeCommand extends Command
182
172
183
173
Interface have suffix of "Interface", trait have "Trait" suffix exclusively
184
174
185
- - class : [`Symplify\PHPStanRules\Rules\Explicit\ExplicitClassPrefixSuffixRule`](../src/Rules/Explicit/ExplicitClassPrefixSuffixRule.php)
175
+ ``` yaml
176
+ rules :
177
+ - Symplify\PHPStanRules\Rules\Explicit\ExplicitClassPrefixSuffixRule
178
+ ` ` `
186
179
187
180
` ` ` php
188
181
<?php
@@ -228,7 +221,10 @@ abstract class AbstractClass
228
221
229
222
Array method calls [ $this, "method"] are not allowed. Use explicit method instead to help PhpStorm, PHPStan and Rector understand your code
230
223
231
- - class : [`Symplify\PHPStanRules\Rules\Complexity\ForbiddenArrayMethodCallRule`](../src/Rules/Complexity/ForbiddenArrayMethodCallRule.php)
224
+ ``` yaml
225
+ rules :
226
+ - Symplify\PHPStanRules\Rules\Complexity\ForbiddenArrayMethodCallRule
227
+ ` ` `
232
228
233
229
` ` ` php
234
230
usort($items, [$this, "method"]);
@@ -252,7 +248,10 @@ usort($items, function (array $apples) {
252
248
253
249
Only abstract classes can be extended
254
250
255
- - class : [`Symplify\PHPStanRules\Rules\ForbiddenExtendOfNonAbstractClassRule`](../src/Rules/ForbiddenExtendOfNonAbstractClassRule.php)
251
+ ``` yaml
252
+ rules :
253
+ - Symplify\PHPStanRules\Rules\ForbiddenExtendOfNonAbstractClassRule
254
+ ` ` `
256
255
257
256
` ` ` php
258
257
final class SomeClass extends ParentClass
@@ -288,8 +287,6 @@ Function `"%s()"` cannot be used/left in the code
288
287
289
288
:wrench : ** configure it!**
290
289
291
- - class : [`Symplify\PHPStanRules\Rules\ForbiddenFuncCallRule`](../src/Rules/ForbiddenFuncCallRule.php)
292
-
293
290
``` yaml
294
291
services :
295
292
-
@@ -351,7 +348,10 @@ echo $value;
351
348
352
349
Multiple class/interface/trait is not allowed in single file
353
350
354
- - class : [`Symplify\PHPStanRules\Rules\ForbiddenMultipleClassLikeInOneFileRule`](../src/Rules/ForbiddenMultipleClassLikeInOneFileRule.php)
351
+ ``` yaml
352
+ rules :
353
+ - Symplify\PHPStanRules\Rules\ForbiddenMultipleClassLikeInOneFileRule
354
+ ` ` `
355
355
356
356
` ` ` php
357
357
// src/SomeClass.php
@@ -390,8 +390,6 @@ interface SomeInterface
390
390
391
391
:wrench : ** configure it!**
392
392
393
- - class : [`Symplify\PHPStanRules\Rules\ForbiddenNodeRule`](../src/Rules/ForbiddenNodeRule.php)
394
-
395
393
``` yaml
396
394
services :
397
395
-
@@ -424,7 +422,10 @@ return strlen('...');
424
422
425
423
Avoid static access of constants, as they can change value. Use interface and contract method instead
426
424
427
- - class : [`Symplify\PHPStanRules\Rules\ForbiddenStaticClassConstFetchRule`](../src/Rules/ForbiddenStaticClassConstFetchRule.php)
425
+ ``` yaml
426
+ rules :
427
+ - Symplify\PHPStanRules\Rules\ForbiddenStaticClassConstFetchRule
428
+ ` ` `
428
429
429
430
` ` ` php
430
431
class SomeClass
@@ -458,7 +459,10 @@ class SomeClass
458
459
459
460
Use explicit names over dynamic ones
460
461
461
- - class : [`Symplify\PHPStanRules\Rules\NoDynamicNameRule`](../src/Rules/NoDynamicNameRule.php)
462
+ ``` yaml
463
+ rules :
464
+ - Symplify\PHPStanRules\Rules\NoDynamicNameRule
465
+ ` ` `
462
466
463
467
` ` ` php
464
468
class SomeClass
@@ -492,7 +496,10 @@ class SomeClass
492
496
493
497
Class with #[ Entity] attribute must be located in "Entity" namespace to be loaded by Doctrine
494
498
495
- - class : [`Symplify\PHPStanRules\Rules\NoEntityOutsideEntityNamespaceRule`](../src/Rules/NoEntityOutsideEntityNamespaceRule.php)
499
+ ``` yaml
500
+ rules :
501
+ - Symplify\PHPStanRules\Rules\NoEntityOutsideEntityNamespaceRule
502
+ ` ` `
496
503
497
504
` ` ` php
498
505
namespace App\ValueObject;
@@ -528,7 +535,10 @@ class Product
528
535
529
536
Global constants are forbidden. Use enum-like class list instead
530
537
531
- - class : [`Symplify\PHPStanRules\Rules\NoGlobalConstRule`](../src/Rules/NoGlobalConstRule.php)
538
+ ``` yaml
539
+ rules :
540
+ - Symplify\PHPStanRules\Rules\NoGlobalConstRule
541
+ ` ` `
532
542
533
543
` ` ` php
534
544
const SOME_GLOBAL_CONST = 'value';
@@ -556,7 +566,10 @@ class SomeClass
556
566
557
567
Use local named constant instead of inline string for regex to explain meaning by constant name
558
568
559
- - class : [`Symplify\PHPStanRules\Rules\NoInlineStringRegexRule`](../src/Rules/NoInlineStringRegexRule.php)
569
+ ``` yaml
570
+ rules :
571
+ - Symplify\PHPStanRules\Rules\NoInlineStringRegexRule
572
+ ` ` `
560
573
561
574
` ` ` php
562
575
class SomeClass
@@ -595,7 +608,10 @@ class SomeClass
595
608
596
609
Use explicit return value over magic &reference
597
610
598
- - class : [`Symplify\PHPStanRules\Rules\NoReferenceRule`](../src/Rules/NoReferenceRule.php)
611
+ ``` yaml
612
+ rules :
613
+ - Symplify\PHPStanRules\Rules\NoReferenceRule
614
+ ` ` `
599
615
600
616
` ` ` php
601
617
class SomeClass
@@ -628,7 +644,10 @@ class SomeClass
628
644
629
645
Use value object over return of values
630
646
631
- - class : [`Symplify\PHPStanRules\Rules\NoReturnArrayVariableListRule`](../src/Rules/NoReturnArrayVariableListRule.php)
647
+ ``` yaml
648
+ rules :
649
+ - Symplify\PHPStanRules\Rules\NoReturnArrayVariableListRule
650
+ ` ` `
632
651
633
652
` ` ` php
634
653
class ReturnVariables
@@ -662,7 +681,10 @@ final class ReturnVariables
662
681
663
682
Setter method cannot return anything, only set value
664
683
665
- - class : [`Symplify\PHPStanRules\Rules\NoReturnSetterMethodRule`](../src/Rules/NoReturnSetterMethodRule.php)
684
+ ``` yaml
685
+ rules :
686
+ - Symplify\PHPStanRules\Rules\NoReturnSetterMethodRule
687
+ ` ` `
666
688
667
689
` ` ` php
668
690
final class SomeClass
@@ -700,7 +722,10 @@ final class SomeClass
700
722
701
723
Interface "%s" has only single implementer. Consider using the class directly as there is no point in using the interface.
702
724
703
- - class : [`Symplify\PHPStanRules\Rules\NoSingleInterfaceImplementerRule`](../src/Rules/NoSingleInterfaceImplementerRule.php)
725
+ ``` yaml
726
+ rules :
727
+ - Symplify\PHPStanRules\Rules\NoSingleInterfaceImplementerRule
728
+ ` ` `
704
729
705
730
` ` ` php
706
731
class SomeClass implements SomeInterface
@@ -738,7 +763,10 @@ interface SomeInterface
738
763
739
764
Mocking "%s" class is forbidden. Use direct/anonymous class instead for better static analysis
740
765
741
- - class : [`Symplify\PHPStanRules\Rules\PHPUnit\NoTestMocksRule`](../src/Rules/PHPUnit/NoTestMocksRule.php)
766
+ ``` yaml
767
+ rules :
768
+ - Symplify\PHPStanRules\Rules\PHPUnit\NoTestMocksRule
769
+ ` ` `
742
770
743
771
` ` ` php
744
772
use PHPUnit\Framework\TestCase;
@@ -778,8 +806,6 @@ Instead of "%s" class/interface use "%s"
778
806
779
807
:wrench : ** configure it!**
780
808
781
- - class : [`Symplify\PHPStanRules\Rules\PreferredClassRule`](../src/Rules/PreferredClassRule.php)
782
-
783
809
``` yaml
784
810
services :
785
811
-
@@ -824,7 +850,10 @@ class SomeClass
824
850
825
851
Change ` "%s()" ` method visibility to "%s" to respect parent method visibility.
826
852
827
- - class : [`Symplify\PHPStanRules\Rules\PreventParentMethodVisibilityOverrideRule`](../src/Rules/PreventParentMethodVisibilityOverrideRule.php)
853
+ ``` yaml
854
+ rules :
855
+ - Symplify\PHPStanRules\Rules\PreventParentMethodVisibilityOverrideRule
856
+ ` ` `
828
857
829
858
` ` ` php
830
859
class SomeParentClass
@@ -870,7 +899,10 @@ class SomeClass extends SomeParentClass
870
899
871
900
Name your constant with "_ REGEX" suffix, instead of "%s"
872
901
873
- - class : [`Symplify\PHPStanRules\Rules\RegexSuffixInRegexConstantRule`](../src/Rules/RegexSuffixInRegexConstantRule.php)
902
+ ``` yaml
903
+ rules :
904
+ - Symplify\PHPStanRules\Rules\RegexSuffixInRegexConstantRule
905
+ ` ` `
874
906
875
907
` ` ` php
876
908
class SomeClass
@@ -908,7 +940,10 @@ class SomeClass
908
940
909
941
Attribute must have all names explicitly defined
910
942
911
- - class : [`Symplify\PHPStanRules\Rules\RequireAttributeNameRule`](../src/Rules/RequireAttributeNameRule.php)
943
+ ``` yaml
944
+ rules :
945
+ - Symplify\PHPStanRules\Rules\RequireAttributeNameRule
946
+ ` ` `
912
947
913
948
` ` ` php
914
949
use Symfony\Component\Routing\Annotation\Route;
@@ -946,7 +981,10 @@ class SomeController
946
981
947
982
Attribute must be located in "Attribute" namespace
948
983
949
- - class : [`Symplify\PHPStanRules\Rules\Domain\RequireAttributeNamespaceRule`](../src/Rules/Domain/RequireAttributeNamespaceRule.php)
984
+ ``` yaml
985
+ rules :
986
+ - Symplify\PHPStanRules\Rules\Domain\RequireAttributeNamespaceRule
987
+ ` ` `
950
988
951
989
` ` ` php
952
990
// app/Entity/SomeAttribute.php
@@ -980,7 +1018,10 @@ final class SomeAttribute
980
1018
981
1019
` Exception ` must be located in "Exception" namespace
982
1020
983
- - class : [`Symplify\PHPStanRules\Rules\Domain\RequireExceptionNamespaceRule`](../src/Rules/Domain/RequireExceptionNamespaceRule.php)
1021
+ ``` yaml
1022
+ rules :
1023
+ - Symplify\PHPStanRules\Rules\Domain\RequireExceptionNamespaceRule
1024
+ ` ` `
984
1025
985
1026
` ` ` php
986
1027
// app/Controller/SomeException.php
@@ -1013,7 +1054,10 @@ final class SomeException extends Exception
1013
1054
1014
1055
Use invokable controller with ` __invoke() ` method instead of named action method
1015
1056
1016
- - class : [`Symplify\PHPStanRules\Symfony\Rules\RequireInvokableControllerRule`](../src/Symfony/Rules/RequireInvokableControllerRule.php)
1057
+ ``` yaml
1058
+ rules :
1059
+ - Symplify\PHPStanRules\Symfony\Rules\RequireInvokableControllerRule
1060
+ ` ` `
1017
1061
1018
1062
` ` ` php
1019
1063
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
@@ -1053,7 +1097,10 @@ final class SomeController extends AbstractController
1053
1097
1054
1098
Enum constants "%s" are duplicated. Make them unique instead
1055
1099
1056
- - class : [`Symplify\PHPStanRules\Rules\Enum\RequireUniqueEnumConstantRule`](../src/Rules/Enum/RequireUniqueEnumConstantRule.php)
1100
+ ``` yaml
1101
+ rules :
1102
+ - Symplify\PHPStanRules\Rules\Enum\RequireUniqueEnumConstantRule
1103
+ ` ` `
1057
1104
1058
1105
` ` ` php
1059
1106
use MyCLabs\Enum\Enum;
@@ -1091,8 +1138,6 @@ Class "%s" is missing `@see` annotation with test case class reference
1091
1138
1092
1139
:wrench : ** configure it!**
1093
1140
1094
- - class : [`Symplify\PHPStanRules\Rules\SeeAnnotationToTestRule`](../src/Rules/SeeAnnotationToTestRule.php)
1095
-
1096
1141
``` yaml
1097
1142
services :
1098
1143
-
@@ -1132,7 +1177,10 @@ class SomeClass extends Rule
1132
1177
1133
1178
Constant "%s" must be uppercase
1134
1179
1135
- - class : [`Symplify\PHPStanRules\Rules\UppercaseConstantRule`](../src/Rules/UppercaseConstantRule.php)
1180
+ ``` yaml
1181
+ rules :
1182
+ - Symplify\PHPStanRules\Rules\UppercaseConstantRule
1183
+ ` ` `
1136
1184
1137
1185
` ` ` php
1138
1186
final class SomeClass
0 commit comments