From 53425237f0024bf8e2e569617af16de464cbeb3c Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Mon, 27 Oct 2025 12:15:14 +0100 Subject: [PATCH 1/6] Faster AutowiredAttributeServicesExtension->processParameters() --- .../AutowiredAttributeServicesExtension.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/DependencyInjection/AutowiredAttributeServicesExtension.php b/src/DependencyInjection/AutowiredAttributeServicesExtension.php index 3b8182cf53..94805a70e9 100644 --- a/src/DependencyInjection/AutowiredAttributeServicesExtension.php +++ b/src/DependencyInjection/AutowiredAttributeServicesExtension.php @@ -135,6 +135,10 @@ private function processParameters(string $className, ServiceDefinition $definit { $builder = $this->getContainerBuilder(); foreach ($autowiredParameters as $autowiredParameter) { + if ($autowiredParameter->method === '' || $autowiredParameter->method[0] !== '_') { + continue; + } + if (strcasecmp($autowiredParameter->method, '__construct') !== 0) { continue; } From a970c8c3b0a3187bb7414a18e60422827afae575 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Mon, 27 Oct 2025 12:16:24 +0100 Subject: [PATCH 2/6] Update AutowiredAttributeServicesExtension.php --- src/DependencyInjection/AutowiredAttributeServicesExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DependencyInjection/AutowiredAttributeServicesExtension.php b/src/DependencyInjection/AutowiredAttributeServicesExtension.php index 94805a70e9..307f5011c5 100644 --- a/src/DependencyInjection/AutowiredAttributeServicesExtension.php +++ b/src/DependencyInjection/AutowiredAttributeServicesExtension.php @@ -135,7 +135,7 @@ private function processParameters(string $className, ServiceDefinition $definit { $builder = $this->getContainerBuilder(); foreach ($autowiredParameters as $autowiredParameter) { - if ($autowiredParameter->method === '' || $autowiredParameter->method[0] !== '_') { + if ($autowiredParameter->method[0] !== '_') { continue; } From 15131c71b721f0082cabde2f1aba80ea494766d0 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Mon, 27 Oct 2025 13:53:18 +0100 Subject: [PATCH 3/6] reduce duplicate work in parameter processing --- .../AutowiredAttributeServicesExtension.php | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/DependencyInjection/AutowiredAttributeServicesExtension.php b/src/DependencyInjection/AutowiredAttributeServicesExtension.php index 307f5011c5..394e3a5c9a 100644 --- a/src/DependencyInjection/AutowiredAttributeServicesExtension.php +++ b/src/DependencyInjection/AutowiredAttributeServicesExtension.php @@ -39,6 +39,14 @@ public function loadConfiguration(): void $builder = $this->getContainerBuilder(); $autowiredParameters = Attributes::findTargetMethodParameters(AutowiredParameter::class); + $constructorParameters = []; + foreach($autowiredParameters as $parameter) { + if (strcasecmp($parameter->method, '__construct') !== 0) { + continue; + } + $constructorParameters[$parameter->class] ??= []; + $constructorParameters[$parameter->class][] = $parameter; + } foreach (Attributes::findTargetClasses(AutowiredService::class) as $class) { $reflection = new ReflectionClass($class->name); @@ -53,7 +61,7 @@ public function loadConfiguration(): void $definition->setFactory(new Statement([new Reference(substr($ref, 1)), $method])); } - $this->processParameters($class->name, $definition, $autowiredParameters); + $this->processParameters($class->name, $definition, $constructorParameters); foreach (ValidateServiceTagsExtension::INTERFACE_TAG_MAPPING as $interface => $tag) { if (!$reflection->implementsInterface($interface)) { @@ -76,7 +84,7 @@ public function loadConfiguration(): void $definition->setFactory(new Statement([new Reference(substr($ref, 1)), $method])); } - $this->processParameters($class->name, $definition, $autowiredParameters); + $this->processParameters($class->name, $definition, $constructorParameters); } foreach (Attributes::findTargetClasses(GenerateFactory::class) as $class) { @@ -89,7 +97,7 @@ public function loadConfiguration(): void } $resultDefinition = $definition->getResultDefinition(); - $this->processParameters($class->name, $resultDefinition, $autowiredParameters); + $this->processParameters($class->name, $resultDefinition, $constructorParameters); } /** @var stdClass&object{level: int|null} $config */ @@ -109,7 +117,7 @@ public function loadConfiguration(): void ->setAutowired($class->name) ->addTag(LazyRegistry::RULE_TAG); - $this->processParameters($class->name, $definition, $autowiredParameters); + $this->processParameters($class->name, $definition, $constructorParameters); } foreach (Attributes::findTargetClasses(RegisteredCollector::class) as $class) { @@ -123,28 +131,18 @@ public function loadConfiguration(): void ->setAutowired($class->name) ->addTag(RegistryFactory::COLLECTOR_TAG); - $this->processParameters($class->name, $definition, $autowiredParameters); + $this->processParameters($class->name, $definition, $constructorParameters); } } /** * @param class-string $className - * @param TargetMethodParameter[] $autowiredParameters + * @param array>> $constructorParameters */ - private function processParameters(string $className, ServiceDefinition $definition, array $autowiredParameters): void + private function processParameters(string $className, ServiceDefinition $definition, array $constructorParameters): void { $builder = $this->getContainerBuilder(); - foreach ($autowiredParameters as $autowiredParameter) { - if ($autowiredParameter->method[0] !== '_') { - continue; - } - - if (strcasecmp($autowiredParameter->method, '__construct') !== 0) { - continue; - } - if (strcasecmp($autowiredParameter->class, $className) !== 0) { - continue; - } + foreach($constructorParameters[$className] ?? [] as $autowiredParameter) { $ref = $autowiredParameter->attribute->ref; if ($ref === null) { $argument = Helpers::expand( From 06c96cf5657d894ba1b06b384bfb18c03a2945d8 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Mon, 27 Oct 2025 13:55:37 +0100 Subject: [PATCH 4/6] cs --- .../AutowiredAttributeServicesExtension.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DependencyInjection/AutowiredAttributeServicesExtension.php b/src/DependencyInjection/AutowiredAttributeServicesExtension.php index 394e3a5c9a..cd1031f4b0 100644 --- a/src/DependencyInjection/AutowiredAttributeServicesExtension.php +++ b/src/DependencyInjection/AutowiredAttributeServicesExtension.php @@ -40,7 +40,7 @@ public function loadConfiguration(): void $autowiredParameters = Attributes::findTargetMethodParameters(AutowiredParameter::class); $constructorParameters = []; - foreach($autowiredParameters as $parameter) { + foreach ($autowiredParameters as $parameter) { if (strcasecmp($parameter->method, '__construct') !== 0) { continue; } @@ -142,7 +142,7 @@ public function loadConfiguration(): void private function processParameters(string $className, ServiceDefinition $definition, array $constructorParameters): void { $builder = $this->getContainerBuilder(); - foreach($constructorParameters[$className] ?? [] as $autowiredParameter) { + foreach ($constructorParameters[$className] ?? [] as $autowiredParameter) { $ref = $autowiredParameter->attribute->ref; if ($ref === null) { $argument = Helpers::expand( From bd356a51786e651cd04e716f0defa7326aa9b01d Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Mon, 27 Oct 2025 14:46:52 +0100 Subject: [PATCH 5/6] Update AutowiredAttributeServicesExtension.php --- .../AutowiredAttributeServicesExtension.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/DependencyInjection/AutowiredAttributeServicesExtension.php b/src/DependencyInjection/AutowiredAttributeServicesExtension.php index cd1031f4b0..cc89c5faae 100644 --- a/src/DependencyInjection/AutowiredAttributeServicesExtension.php +++ b/src/DependencyInjection/AutowiredAttributeServicesExtension.php @@ -61,7 +61,7 @@ public function loadConfiguration(): void $definition->setFactory(new Statement([new Reference(substr($ref, 1)), $method])); } - $this->processParameters($class->name, $definition, $constructorParameters); + $this->processConstructorParameters($class->name, $definition, $constructorParameters); foreach (ValidateServiceTagsExtension::INTERFACE_TAG_MAPPING as $interface => $tag) { if (!$reflection->implementsInterface($interface)) { @@ -84,7 +84,7 @@ public function loadConfiguration(): void $definition->setFactory(new Statement([new Reference(substr($ref, 1)), $method])); } - $this->processParameters($class->name, $definition, $constructorParameters); + $this->processConstructorParameters($class->name, $definition, $constructorParameters); } foreach (Attributes::findTargetClasses(GenerateFactory::class) as $class) { @@ -97,7 +97,7 @@ public function loadConfiguration(): void } $resultDefinition = $definition->getResultDefinition(); - $this->processParameters($class->name, $resultDefinition, $constructorParameters); + $this->processConstructorParameters($class->name, $resultDefinition, $constructorParameters); } /** @var stdClass&object{level: int|null} $config */ @@ -117,7 +117,7 @@ public function loadConfiguration(): void ->setAutowired($class->name) ->addTag(LazyRegistry::RULE_TAG); - $this->processParameters($class->name, $definition, $constructorParameters); + $this->processConstructorParameters($class->name, $definition, $constructorParameters); } foreach (Attributes::findTargetClasses(RegisteredCollector::class) as $class) { @@ -131,7 +131,7 @@ public function loadConfiguration(): void ->setAutowired($class->name) ->addTag(RegistryFactory::COLLECTOR_TAG); - $this->processParameters($class->name, $definition, $constructorParameters); + $this->processConstructorParameters($class->name, $definition, $constructorParameters); } } @@ -139,7 +139,7 @@ public function loadConfiguration(): void * @param class-string $className * @param array>> $constructorParameters */ - private function processParameters(string $className, ServiceDefinition $definition, array $constructorParameters): void + private function processConstructorParameters(string $className, ServiceDefinition $definition, array $constructorParameters): void { $builder = $this->getContainerBuilder(); foreach ($constructorParameters[$className] ?? [] as $autowiredParameter) { From 3304f4d25c03b6fe83d5e8b58f6ed308053bd6da Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Tue, 28 Oct 2025 06:34:19 +0100 Subject: [PATCH 6/6] fix case in-sensitivity --- .../AutowiredAttributeServicesExtension.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/DependencyInjection/AutowiredAttributeServicesExtension.php b/src/DependencyInjection/AutowiredAttributeServicesExtension.php index cc89c5faae..cf92776ad2 100644 --- a/src/DependencyInjection/AutowiredAttributeServicesExtension.php +++ b/src/DependencyInjection/AutowiredAttributeServicesExtension.php @@ -19,6 +19,7 @@ use stdClass; use function explode; use function strcasecmp; +use function strtolower; use function substr; final class AutowiredAttributeServicesExtension extends CompilerExtension @@ -44,8 +45,9 @@ public function loadConfiguration(): void if (strcasecmp($parameter->method, '__construct') !== 0) { continue; } - $constructorParameters[$parameter->class] ??= []; - $constructorParameters[$parameter->class][] = $parameter; + $lowerClass = strtolower($parameter->class); + $constructorParameters[$lowerClass] ??= []; + $constructorParameters[$lowerClass][] = $parameter; } foreach (Attributes::findTargetClasses(AutowiredService::class) as $class) { @@ -137,12 +139,12 @@ public function loadConfiguration(): void /** * @param class-string $className - * @param array>> $constructorParameters + * @param array>> $constructorParameters */ private function processConstructorParameters(string $className, ServiceDefinition $definition, array $constructorParameters): void { $builder = $this->getContainerBuilder(); - foreach ($constructorParameters[$className] ?? [] as $autowiredParameter) { + foreach ($constructorParameters[strtolower($className)] ?? [] as $autowiredParameter) { $ref = $autowiredParameter->attribute->ref; if ($ref === null) { $argument = Helpers::expand(