[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\Argument\ServiceLocatorArgument;
|
||||||
use Symfony\Component\DependencyInjection\Container;
|
use Symfony\Component\DependencyInjection\Container;
|
||||||
use Symfony\Component\DependencyInjection\Definition;
|
use Symfony\Component\DependencyInjection\Definition;
|
||||||
use Symfony\Component\DependencyInjection\Exception\EnvNotFoundException;
|
|
||||||
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
|
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
|
||||||
use Symfony\Component\DependencyInjection\Exception\InvalidParameterTypeException;
|
use Symfony\Component\DependencyInjection\Exception\InvalidParameterTypeException;
|
||||||
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
|
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) {
|
if ('' === preg_replace('/'.$envPlaceholderUniquePrefix.'_\w+_[a-f0-9]{32}/U', '', $value, -1, $c) && 1 === $c) {
|
||||||
try {
|
try {
|
||||||
$value = $this->container->resolveEnvPlaceholders($value, true);
|
$value = $this->container->resolveEnvPlaceholders($value, true);
|
||||||
} catch (EnvNotFoundException | RuntimeException $e) {
|
} catch (\Exception $e) {
|
||||||
// If an env placeholder cannot be resolved, we skip the validation.
|
// If an env placeholder cannot be resolved, we skip the validation.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -250,7 +249,11 @@ final class CheckTypeDeclarationsPass extends AbstractRecursivePass
|
|||||||
return;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -536,6 +536,42 @@ class CheckTypeDeclarationsPassTest extends TestCase
|
|||||||
$this->addToAssertionCount(1);
|
$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()
|
public function testProcessPassingBuiltinTypeDoesNotLoadCodeByDefault()
|
||||||
{
|
{
|
||||||
$container = new ContainerBuilder();
|
$container = new ContainerBuilder();
|
||||||
|
@ -13,4 +13,14 @@ class Foo
|
|||||||
{
|
{
|
||||||
return new Bar($stdClass);
|
return new Bar($stdClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function createCallable(): callable
|
||||||
|
{
|
||||||
|
return function() {};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function createArray(): array
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user