[DependencyInjection][CheckTypeDeclarationsPass] Handle \Closure for callable

This commit is contained in:
Thomas Calvet 2019-12-20 17:42:47 +01:00
parent 5973dacbd9
commit d6a7fbfbc3
3 changed files with 21 additions and 1 deletions

View File

@ -166,7 +166,7 @@ final class CheckTypeDeclarationsPass extends AbstractRecursivePass
return;
}
if ('callable' === $type && method_exists($class, '__invoke')) {
if ('callable' === $type && (\Closure::class === $class || method_exists($class, '__invoke'))) {
return;
}

View File

@ -681,4 +681,20 @@ class CheckTypeDeclarationsPassTest extends TestCase
$this->addToAssertionCount(1);
}
public function testProcessHandleClosureForCallable()
{
$closureDefinition = new Definition(\Closure::class);
$closureDefinition->setFactory([\Closure::class, 'fromCallable']);
$closureDefinition->setArguments(['strlen']);
$container = new ContainerBuilder();
$container
->register('foobar', BarMethodCall::class)
->addMethodCall('setCallable', [$closureDefinition]);
(new CheckTypeDeclarationsPass(true))->process($container);
$this->addToAssertionCount(1);
}
}

View File

@ -36,4 +36,8 @@ class BarMethodCall
public function setIterable(iterable $iterable)
{
}
public function setCallable(callable $callable): void
{
}
}