1919use stdClass ;
2020use function explode ;
2121use function strcasecmp ;
22+ use function strtolower ;
2223use function substr ;
2324
2425final class AutowiredAttributeServicesExtension extends CompilerExtension
@@ -39,6 +40,15 @@ public function loadConfiguration(): void
3940 $ builder = $ this ->getContainerBuilder ();
4041
4142 $ autowiredParameters = Attributes::findTargetMethodParameters (AutowiredParameter::class);
43+ $ constructorParameters = [];
44+ foreach ($ autowiredParameters as $ parameter ) {
45+ if (strcasecmp ($ parameter ->method , '__construct ' ) !== 0 ) {
46+ continue ;
47+ }
48+ $ lowerClass = strtolower ($ parameter ->class );
49+ $ constructorParameters [$ lowerClass ] ??= [];
50+ $ constructorParameters [$ lowerClass ][] = $ parameter ;
51+ }
4252
4353 foreach (Attributes::findTargetClasses (AutowiredService::class) as $ class ) {
4454 $ reflection = new ReflectionClass ($ class ->name );
@@ -53,7 +63,7 @@ public function loadConfiguration(): void
5363 $ definition ->setFactory (new Statement ([new Reference (substr ($ ref , 1 )), $ method ]));
5464 }
5565
56- $ this ->processParameters ($ class ->name , $ definition , $ autowiredParameters );
66+ $ this ->processConstructorParameters ($ class ->name , $ definition , $ constructorParameters );
5767
5868 foreach (ValidateServiceTagsExtension::INTERFACE_TAG_MAPPING as $ interface => $ tag ) {
5969 if (!$ reflection ->implementsInterface ($ interface )) {
@@ -76,7 +86,7 @@ public function loadConfiguration(): void
7686 $ definition ->setFactory (new Statement ([new Reference (substr ($ ref , 1 )), $ method ]));
7787 }
7888
79- $ this ->processParameters ($ class ->name , $ definition , $ autowiredParameters );
89+ $ this ->processConstructorParameters ($ class ->name , $ definition , $ constructorParameters );
8090 }
8191
8292 foreach (Attributes::findTargetClasses (GenerateFactory::class) as $ class ) {
@@ -89,7 +99,7 @@ public function loadConfiguration(): void
8999 }
90100
91101 $ resultDefinition = $ definition ->getResultDefinition ();
92- $ this ->processParameters ($ class ->name , $ resultDefinition , $ autowiredParameters );
102+ $ this ->processConstructorParameters ($ class ->name , $ resultDefinition , $ constructorParameters );
93103 }
94104
95105 /** @var stdClass&object{level: int|null} $config */
@@ -109,7 +119,7 @@ public function loadConfiguration(): void
109119 ->setAutowired ($ class ->name )
110120 ->addTag (LazyRegistry::RULE_TAG );
111121
112- $ this ->processParameters ($ class ->name , $ definition , $ autowiredParameters );
122+ $ this ->processConstructorParameters ($ class ->name , $ definition , $ constructorParameters );
113123 }
114124
115125 foreach (Attributes::findTargetClasses (RegisteredCollector::class) as $ class ) {
@@ -123,24 +133,18 @@ public function loadConfiguration(): void
123133 ->setAutowired ($ class ->name )
124134 ->addTag (RegistryFactory::COLLECTOR_TAG );
125135
126- $ this ->processParameters ($ class ->name , $ definition , $ autowiredParameters );
136+ $ this ->processConstructorParameters ($ class ->name , $ definition , $ constructorParameters );
127137 }
128138 }
129139
130140 /**
131141 * @param class-string $className
132- * @param TargetMethodParameter<AutowiredParameter>[] $autowiredParameters
142+ * @param array<lowercase-string, non-empty-list< TargetMethodParameter<AutowiredParameter>>> $constructorParameters
133143 */
134- private function processParameters (string $ className , ServiceDefinition $ definition , array $ autowiredParameters ): void
144+ private function processConstructorParameters (string $ className , ServiceDefinition $ definition , array $ constructorParameters ): void
135145 {
136146 $ builder = $ this ->getContainerBuilder ();
137- foreach ($ autowiredParameters as $ autowiredParameter ) {
138- if (strcasecmp ($ autowiredParameter ->method , '__construct ' ) !== 0 ) {
139- continue ;
140- }
141- if (strcasecmp ($ autowiredParameter ->class , $ className ) !== 0 ) {
142- continue ;
143- }
147+ foreach ($ constructorParameters [strtolower ($ className )] ?? [] as $ autowiredParameter ) {
144148 $ ref = $ autowiredParameter ->attribute ->ref ;
145149 if ($ ref === null ) {
146150 $ argument = Helpers::expand (
0 commit comments