[DI] Fix CheckTypeDeclarationPass
This commit is contained in:
parent
3ae3244b8c
commit
cbf4dfd10f
@ -17,7 +17,6 @@ use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
|
||||
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
|
||||
use Symfony\Component\DependencyInjection\Container;
|
||||
use Symfony\Component\DependencyInjection\Definition;
|
||||
use Symfony\Component\DependencyInjection\Exception\EnvNotFoundException;
|
||||
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
|
||||
use Symfony\Component\DependencyInjection\Exception\InvalidParameterTypeException;
|
||||
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
|
||||
@ -207,7 +206,7 @@ final class CheckTypeDeclarationsPass extends AbstractRecursivePass
|
||||
if ('' === preg_replace('/'.$envPlaceholderUniquePrefix.'_\w+_[a-f0-9]{32}/U', '', $value, -1, $c) && 1 === $c) {
|
||||
try {
|
||||
$value = $this->container->resolveEnvPlaceholders($value, true);
|
||||
} catch (EnvNotFoundException | RuntimeException $e) {
|
||||
} catch (\Exception $e) {
|
||||
// If an env placeholder cannot be resolved, we skip the validation.
|
||||
return;
|
||||
}
|
||||
@ -250,7 +249,11 @@ final class CheckTypeDeclarationsPass extends AbstractRecursivePass
|
||||
return;
|
||||
}
|
||||
|
||||
if ('iterable' === $type && (\is_array($value) || is_subclass_of($class, \Traversable::class))) {
|
||||
if ('iterable' === $type && (\is_array($value) || 'array' === $class || is_subclass_of($class, \Traversable::class))) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($type === $class) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -536,6 +536,42 @@ class CheckTypeDeclarationsPassTest extends TestCase
|
||||
$this->addToAssertionCount(1);
|
||||
}
|
||||
|
||||
public function testProcessFactoryForTypeSameAsClass()
|
||||
{
|
||||
$container = new ContainerBuilder();
|
||||
|
||||
$container->register('foo', Foo::class);
|
||||
$container->register('bar', 'callable')
|
||||
->setFactory([
|
||||
new Reference('foo'),
|
||||
'createCallable',
|
||||
]);
|
||||
$container->register('bar_call', BarMethodCall::class)
|
||||
->addMethodCall('setCallable', [new Reference('bar')]);
|
||||
|
||||
(new CheckTypeDeclarationsPass(true))->process($container);
|
||||
|
||||
$this->addToAssertionCount(1);
|
||||
}
|
||||
|
||||
public function testProcessFactoryForIterableTypeAndArrayClass()
|
||||
{
|
||||
$container = new ContainerBuilder();
|
||||
|
||||
$container->register('foo', Foo::class);
|
||||
$container->register('bar', 'array')
|
||||
->setFactory([
|
||||
new Reference('foo'),
|
||||
'createArray',
|
||||
]);
|
||||
$container->register('bar_call', BarMethodCall::class)
|
||||
->addMethodCall('setIterable', [new Reference('bar')]);
|
||||
|
||||
(new CheckTypeDeclarationsPass(true))->process($container);
|
||||
|
||||
$this->addToAssertionCount(1);
|
||||
}
|
||||
|
||||
public function testProcessPassingBuiltinTypeDoesNotLoadCodeByDefault()
|
||||
{
|
||||
$container = new ContainerBuilder();
|
||||
|
@ -13,4 +13,14 @@ class Foo
|
||||
{
|
||||
return new Bar($stdClass);
|
||||
}
|
||||
|
||||
public static function createCallable(): callable
|
||||
{
|
||||
return function() {};
|
||||
}
|
||||
|
||||
public static function createArray(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user