Skip to content

Commit 20f2f27

Browse files
authored
Faster AutowiredAttributeServicesExtension->processParameters() (#4489)
1 parent a29b29d commit 20f2f27

File tree

1 file changed

+18
-14
lines changed

1 file changed

+18
-14
lines changed

src/DependencyInjection/AutowiredAttributeServicesExtension.php

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use stdClass;
2020
use function explode;
2121
use function strcasecmp;
22+
use function strtolower;
2223
use function substr;
2324

2425
final 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

Comments
 (0)