24
24
*/
25
25
final class RegisterAutoconfigureAttributesPass implements CompilerPassInterface
26
26
{
27
- private $ registerForAutoconfiguration ;
27
+ private static $ registerForAutoconfiguration ;
28
28
29
- public function __construct ()
29
+ /**
30
+ * {@inheritdoc}
31
+ */
32
+ public function process (ContainerBuilder $ container )
30
33
{
31
34
if (80000 > \PHP_VERSION_ID ) {
32
35
return ;
33
36
}
34
37
38
+ foreach ($ container ->getDefinitions () as $ id => $ definition ) {
39
+ if ($ this ->accept ($ definition ) && null !== $ class = $ container ->getReflectionClass ($ definition ->getClass ())) {
40
+ $ this ->processClass ($ container , $ class );
41
+ }
42
+ }
43
+ }
44
+
45
+ public function accept (Definition $ definition ): bool
46
+ {
47
+ return 80000 <= \PHP_VERSION_ID && $ definition ->isAutoconfigured () && !$ definition ->hasTag ('container.ignore_attributes ' );
48
+ }
49
+
50
+ public function processClass (ContainerBuilder $ container , \ReflectionClass $ class )
51
+ {
52
+ foreach ($ class ->getAttributes (Autoconfigure::class, \ReflectionAttribute::IS_INSTANCEOF ) as $ attribute ) {
53
+ self ::registerForAutoconfiguration ($ container , $ class , $ attribute );
54
+ }
55
+ }
56
+
57
+ private static function registerForAutoconfiguration (ContainerBuilder $ container , \ReflectionClass $ class , \ReflectionAttribute $ attribute )
58
+ {
59
+ if (self ::$ registerForAutoconfiguration ) {
60
+ return (self ::$ registerForAutoconfiguration )($ container , $ class , $ attribute );
61
+ }
62
+
35
63
$ parseDefinitions = new \ReflectionMethod (YamlFileLoader::class, 'parseDefinitions ' );
36
64
$ parseDefinitions ->setAccessible (true );
37
65
$ yamlLoader = $ parseDefinitions ->getDeclaringClass ()->newInstanceWithoutConstructor ();
38
66
39
- $ this -> registerForAutoconfiguration = static function (ContainerBuilder $ container , \ReflectionClass $ class , \ReflectionAttribute $ attribute ) use ($ parseDefinitions , $ yamlLoader ) {
67
+ self :: $ registerForAutoconfiguration = static function (ContainerBuilder $ container , \ReflectionClass $ class , \ReflectionAttribute $ attribute ) use ($ parseDefinitions , $ yamlLoader ) {
40
68
$ attribute = (array ) $ attribute ->newInstance ();
41
69
42
70
foreach ($ attribute ['tags ' ] ?? [] as $ i => $ tag ) {
@@ -57,33 +85,7 @@ public function __construct()
57
85
$ class ->getFileName ()
58
86
);
59
87
};
60
- }
61
88
62
- /**
63
- * {@inheritdoc}
64
- */
65
- public function process (ContainerBuilder $ container )
66
- {
67
- if (80000 > \PHP_VERSION_ID ) {
68
- return ;
69
- }
70
-
71
- foreach ($ container ->getDefinitions () as $ id => $ definition ) {
72
- if ($ this ->accept ($ definition ) && null !== $ class = $ container ->getReflectionClass ($ definition ->getClass ())) {
73
- $ this ->processClass ($ container , $ class );
74
- }
75
- }
76
- }
77
-
78
- public function accept (Definition $ definition ): bool
79
- {
80
- return 80000 <= \PHP_VERSION_ID && $ definition ->isAutoconfigured () && !$ definition ->hasTag ('container.ignore_attributes ' );
81
- }
82
-
83
- public function processClass (ContainerBuilder $ container , \ReflectionClass $ class )
84
- {
85
- foreach ($ class ->getAttributes (Autoconfigure::class, \ReflectionAttribute::IS_INSTANCEOF ) as $ attribute ) {
86
- ($ this ->registerForAutoconfiguration )($ container , $ class , $ attribute );
87
- }
89
+ return (self ::$ registerForAutoconfiguration )($ container , $ class , $ attribute );
88
90
}
89
91
}
0 commit comments