Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /