Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a4ef214

Browse files
bug #49379 [DependencyInjection] Fix autowire attribute with nullable parameters (alamirault)
This PR was squashed before being merged into the 6.2 branch. Discussion ---------- [DependencyInjection] Fix autowire attribute with nullable parameters | Q | A | ------------- | --- | Branch? | 6.2 | Bug fix? | yes | New feature? | no | Deprecations? | no | Tickets | Fix #49370 | License | MIT | Doc PR | N/A This PR fix throwing exception `Cannot autowire service "%s": argument "$%s" of method "%s()" %s, you should configure its value explicitly.` when parameter is nullable with null value. (sorry for pinging reviewers, switching branch trigger that) Commits ------- 75af866 [DependencyInjection] Fix autowire attribute with nullable parameters
2 parents a90b3a2 + 75af866 commit a4ef214

File tree

3 files changed

+12
-14
lines changed

3 files changed

+12
-14
lines changed

src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -276,23 +276,17 @@ private function autowireMethod(\ReflectionFunctionAbstract $reflectionMethod, a
276276
continue;
277277
}
278278

279-
$type = ProxyHelper::exportType($parameter, true);
280-
281279
if ($checkAttributes) {
282280
foreach ($parameter->getAttributes() as $attribute) {
283281
if (\in_array($attribute->getName(), [TaggedIterator::class, TaggedLocator::class, Autowire::class, MapDecorated::class], true)) {
284282
$arguments[$index] = $this->processAttribute($attribute->newInstance(), $parameter->allowsNull());
285283

286-
break;
284+
continue 2;
287285
}
288286
}
289-
290-
if ('' !== ($arguments[$index] ?? '')) {
291-
continue;
292-
}
293287
}
294288

295-
if (!$type) {
289+
if (!$type = ProxyHelper::exportType($parameter, true)) {
296290
if (isset($arguments[$index])) {
297291
continue;
298292
}

src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,21 +1185,23 @@ public function testAutowireAttribute()
11851185

11861186
$container->register('some.id', \stdClass::class);
11871187
$container->setParameter('some.parameter', 'foo');
1188+
$container->setParameter('null.parameter', null);
11881189

11891190
(new ResolveClassPass())->process($container);
11901191
(new AutowirePass())->process($container);
11911192

11921193
$definition = $container->getDefinition(AutowireAttribute::class);
11931194

1194-
$this->assertCount(8, $definition->getArguments());
1195+
$this->assertCount(9, $definition->getArguments());
11951196
$this->assertEquals(new Reference('some.id'), $definition->getArgument(0));
11961197
$this->assertEquals(new Expression("parameter('some.parameter')"), $definition->getArgument(1));
11971198
$this->assertSame('foo/bar', $definition->getArgument(2));
1198-
$this->assertEquals(new Reference('some.id'), $definition->getArgument(3));
1199-
$this->assertEquals(new Expression("parameter('some.parameter')"), $definition->getArgument(4));
1200-
$this->assertSame('bar', $definition->getArgument(5));
1201-
$this->assertSame('@bar', $definition->getArgument(6));
1202-
$this->assertEquals(new Reference('invalid.id', ContainerInterface::NULL_ON_INVALID_REFERENCE), $definition->getArgument(7));
1199+
$this->assertNull($definition->getArgument(3));
1200+
$this->assertEquals(new Reference('some.id'), $definition->getArgument(4));
1201+
$this->assertEquals(new Expression("parameter('some.parameter')"), $definition->getArgument(5));
1202+
$this->assertSame('bar', $definition->getArgument(6));
1203+
$this->assertSame('@bar', $definition->getArgument(7));
1204+
$this->assertEquals(new Reference('invalid.id', ContainerInterface::NULL_ON_INVALID_REFERENCE), $definition->getArgument(8));
12031205

12041206
$container->compile();
12051207

src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/autowiring_classes_80.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ public function __construct(
4040
public string $expression,
4141
#[Autowire(value: '%some.parameter%/bar')]
4242
public string $value,
43+
#[Autowire(value: '%null.parameter%')]
44+
public ?string $nullableValue,
4345
#[Autowire('@some.id')]
4446
public \stdClass $serviceAsValue,
4547
#[Autowire("@=parameter('some.parameter')")]

0 commit comments

Comments
 (0)