From e2f69af6bd391abe25052d4bc8a01547a5fc759e Mon Sep 17 00:00:00 2001 From: Kevin van Sonsbeek Date: Mon, 21 Oct 2024 21:16:29 +0200 Subject: [PATCH] [DependencyInjection] Fix linting factories implemented via __callStatic --- .../Compiler/AbstractRecursivePass.php | 4 ++++ .../Compiler/CheckTypeDeclarationsPassTest.php | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AbstractRecursivePass.php b/src/Symfony/Component/DependencyInjection/Compiler/AbstractRecursivePass.php index f7a2176ebcece..b990ad828c1d2 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/AbstractRecursivePass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/AbstractRecursivePass.php @@ -202,6 +202,10 @@ protected function getReflectionMethod(Definition $definition, string $method) return new \ReflectionMethod(static function (...$arguments) {}, '__invoke'); } + if ($r->hasMethod('__callStatic') && ($r = $r->getMethod('__callStatic')) && $r->isPublic()) { + return new \ReflectionMethod(static function (...$arguments) {}, '__invoke'); + } + throw new RuntimeException(sprintf('Invalid service "%s": method "%s()" does not exist.', $this->currentId, $class !== $this->currentId ? $class.'::'.$method : $method)); } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckTypeDeclarationsPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckTypeDeclarationsPassTest.php index 90a5248f1e47d..9101f7fb5b873 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckTypeDeclarationsPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckTypeDeclarationsPassTest.php @@ -1015,6 +1015,17 @@ public function testCallableClass() $this->addToAssertionCount(1); } + public function testStaticCallableClass() + { + $container = new ContainerBuilder(); + $container->register('foo', StaticCallableClass::class) + ->setFactory([StaticCallableClass::class, 'staticMethodCall']); + + (new CheckTypeDeclarationsPass())->process($container); + + $this->addToAssertionCount(1); + } + public function testIgnoreDefinitionFactoryArgument() { $container = new ContainerBuilder(); @@ -1050,3 +1061,10 @@ public function __call($name, $arguments) { } } + +class StaticCallableClass +{ + public static function __callStatic($name, $arguments) + { + } +}