Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 691fd0e

Browse filesBrowse files
[DI] Fix dumping ignore-on-uninitialized references to synthetic services
1 parent 493ce7a commit 691fd0e
Copy full SHA for 691fd0e

File tree

3 files changed

+42
-2
lines changed
Filter options

3 files changed

+42
-2
lines changed

‎src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
+4-2Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1898,8 +1898,10 @@ private function getServiceCall($id, Reference $reference = null)
18981898
return '$this';
18991899
}
19001900

1901-
if ($this->container->hasDefinition($id) && ($definition = $this->container->getDefinition($id)) && !$definition->isSynthetic()) {
1902-
if (null !== $reference && ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE === $reference->getInvalidBehavior()) {
1901+
if ($this->container->hasDefinition($id) && $definition = $this->container->getDefinition($id)) {
1902+
if ($definition->isSynthetic()) {
1903+
$code = sprintf('$this->get(\'%s\', %d)', $id, $reference->getInvalidBehavior());
1904+
} elseif (null !== $reference && ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE === $reference->getInvalidBehavior()) {
19031905
$code = 'null';
19041906
if (!$definition->isShared()) {
19051907
return $code;

‎src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php
+15Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1434,6 +1434,21 @@ public function testArgumentsHaveHigherPriorityThanBindings()
14341434
$this->assertSame('via-argument', $container->get('foo')->class1->identifier);
14351435
$this->assertSame('via-bindings', $container->get('foo')->class2->identifier);
14361436
}
1437+
1438+
public function testUninitializedSyntheticReference()
1439+
{
1440+
$container = new ContainerBuilder();
1441+
$container->register('foo', 'stdClass')->setPublic(true)->setSynthetic(true);
1442+
$container->register('bar', 'stdClass')->setPublic(true)->setShared(false)
1443+
->setProperty('foo', new Reference('foo', ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE));
1444+
1445+
$container->compile();
1446+
1447+
$this->assertEquals((object) array('foo' => null), $container->get('bar'));
1448+
1449+
$container->set('foo', (object) array(123));
1450+
$this->assertEquals((object) array('foo' => (object) array(123)), $container->get('bar'));
1451+
}
14371452
}
14381453

14391454
class FooClass

‎src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php
+23Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -913,6 +913,29 @@ public function testDumpHandlesObjectClassNames()
913913
$this->assertInstanceOf('stdClass', $container->get('bar'));
914914
}
915915

916+
public function testUninitializedSyntheticReference()
917+
{
918+
$container = new ContainerBuilder();
919+
$container->register('foo', 'stdClass')->setPublic(true)->setSynthetic(true);
920+
$container->register('bar', 'stdClass')->setPublic(true)->setShared(false)
921+
->setProperty('foo', new Reference('foo', ContainerBuilder::IGNORE_ON_UNINITIALIZED_REFERENCE));
922+
923+
$container->compile();
924+
925+
$dumper = new PhpDumper($container);
926+
eval('?>'.$dumper->dump(array(
927+
'class' => 'Symfony_DI_PhpDumper_Test_UninitializedSyntheticReference',
928+
'inline_class_loader_parameter' => 'inline_requires',
929+
)));
930+
931+
$container = new \Symfony_DI_PhpDumper_Test_UninitializedSyntheticReference();
932+
933+
$this->assertEquals((object) array('foo' => null), $container->get('bar'));
934+
935+
$container->set('foo', (object) array(123));
936+
$this->assertEquals((object) array('foo' => (object) array(123)), $container->get('bar'));
937+
}
938+
916939
/**
917940
* @group legacy
918941
* @expectedDeprecation The "private" service is private, getting it from the container is deprecated since Symfony 3.2 and will fail in 4.0. You should either make the service public, or stop using the container directly and use dependency injection instead.

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.