2424 */
2525final class RegisterAutoconfigureAttributesPassimplements CompilerPassInterface
2626{
27- private $ registerForAutoconfiguration ;
27+ private static $ registerForAutoconfiguration ;
2828
29- public function __construct ()
29+ /**
30+ * {@inheritdoc}
31+ */
32+ public function process (ContainerBuilder $ container )
3033 {
3134if (80000 > \PHP_VERSION_ID ) {
3235return ;
3336 }
3437
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+
3563$ parseDefinitions =new \ReflectionMethod (YamlFileLoader::class,'parseDefinitions ' );
3664$ parseDefinitions ->setAccessible (true );
3765$ yamlLoader =$ parseDefinitions ->getDeclaringClass ()->newInstanceWithoutConstructor ();
3866
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 ) {
4068$ attribute = (array )$ attribute ->newInstance ();
4169
4270foreach ($ attribute ['tags ' ] ?? []as $ i =>$ tag ) {
@@ -57,33 +85,7 @@ public function __construct()
5785$ class ->getFileName ()
5886 );
5987 };
60- }
6188
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 );
8890 }
8991}