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 22c71bf

Browse filesBrowse files
committed
Simplifying so that there is only one ChildDefinition per interface in automatic config
1 parent 0d0f202 commit 22c71bf
Copy full SHA for 22c71bf

File tree

3 files changed

+33
-26
lines changed
Filter options

3 files changed

+33
-26
lines changed

‎src/Symfony/Component/DependencyInjection/Compiler/ResolveInstanceofConditionalsPass.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/ResolveInstanceofConditionalsPass.php
+6-3Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,14 +102,17 @@ private function processDefinition(ContainerBuilder $container, $id, Definition
102102

103103
private function mergeConditionals(array $automaticInstanceofConditionals, array $instanceofConditionals)
104104
{
105+
// make each value an array of ChildDefinition
106+
$conditionals = array_map(function($childDef) { return array($childDef); }, $automaticInstanceofConditionals);
107+
105108
foreach ($instanceofConditionals as $interface => $instanceofDef) {
106109
if (!isset($automaticInstanceofConditionals[$interface])) {
107-
$automaticInstanceofConditionals[$interface] = array();
110+
$conditionals[$interface] = array();
108111
}
109112

110-
$automaticInstanceofConditionals[$interface][] = $instanceofDef;
113+
$conditionals[$interface][] = $instanceofDef;
111114
}
112115

113-
return $automaticInstanceofConditionals;
116+
return $conditionals;
114117
}
115118
}

‎src/Symfony/Component/DependencyInjection/ContainerBuilder.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/ContainerBuilder.php
+8-19Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -641,14 +641,12 @@ public function merge(ContainerBuilder $container)
641641
}
642642
}
643643

644-
foreach ($container->getAutomaticInstanceofDefinitions() as $interface => $childDefinitions) {
645-
foreach ($childDefinitions as $childDefinition) {
646-
if (!isset($this->automaticInstanceofDefinitions[$interface])) {
647-
$this->automaticInstanceofDefinitions[$interface] = array();
648-
}
649-
650-
$this->automaticInstanceofDefinitions[$interface][] = $childDefinition;
644+
foreach ($container->getAutomaticInstanceofDefinitions() as $interface => $childDefinition) {
645+
if (isset($this->automaticInstanceofDefinitions[$interface])) {
646+
throw new InvalidArgumentException(sprintf('%s has already been autoconfigured and merge() does not support merging autoconfiguration for the same class/interface.', $interface));
651647
}
648+
649+
$this->automaticInstanceofDefinitions[$interface] = $childDefinition;
652650
}
653651
}
654652

@@ -1276,25 +1274,16 @@ public function getExpressionLanguageProviders()
12761274
public function registerForAutoconfiguration($interface)
12771275
{
12781276
if (!isset($this->automaticInstanceofDefinitions[$interface])) {
1279-
$this->automaticInstanceofDefinitions[$interface] = array();
1277+
$this->automaticInstanceofDefinitions[$interface] = new ChildDefinition('');
12801278
}
12811279

1282-
$childDefinition = new ChildDefinition('');
1283-
$this->automaticInstanceofDefinitions[$interface][] = $childDefinition;
1284-
1285-
return $childDefinition;
1280+
return $this->automaticInstanceofDefinitions[$interface];
12861281
}
12871282

12881283
/**
12891284
* Returns an array of ChildDefinition[] keyed by interface.
12901285
*
1291-
* For example:
1292-
* array(
1293-
* 'App\FooInterface' => array(ChildDefinition, ChildDefinition),
1294-
* 'AppBarInterface' => array(ChildDefinition)
1295-
* )
1296-
*
1297-
* @return array
1286+
* @return ChildDefinition[]
12981287
*/
12991288
public function getAutomaticInstanceofDefinitions()
13001289
{

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

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php
+19-4Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -570,11 +570,23 @@ public function testMerge()
570570

571571
$container = new ContainerBuilder();
572572
$config = new ContainerBuilder();
573-
$childDefA1 = $container->registerForAutoconfiguration('AInterface');
573+
$childDefA = $container->registerForAutoconfiguration('AInterface');
574574
$childDefB = $config->registerForAutoconfiguration('BInterface');
575-
$childDefA2 = $config->registerForAutoconfiguration('AInterface');
576575
$container->merge($config);
577-
$this->assertSame(array('AInterface' => array($childDefA1, $childDefA2), 'BInterface' => array($childDefB)), $container->getAutomaticInstanceofDefinitions());
576+
$this->assertSame(array('AInterface' => $childDefA, 'BInterface' => $childDefB), $container->getAutomaticInstanceofDefinitions());
577+
}
578+
579+
/**
580+
* @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
581+
* @expectedExceptionMessage AInterface has already been autoconfigured and merge() does not support merging autoconfiguration for the same class/interface.
582+
*/
583+
public function testMergeThrowsExceptionForDuplicateAutomaticInstanceofDefinitions()
584+
{
585+
$container = new ContainerBuilder();
586+
$config = new ContainerBuilder();
587+
$container->registerForAutoconfiguration('AInterface');
588+
$config->registerForAutoconfiguration('AInterface');
589+
$container->merge($config);
578590
}
579591

580592
public function testResolveEnvValues()
@@ -1111,7 +1123,10 @@ public function testRegisterForAutoconfiguration()
11111123
$container = new ContainerBuilder();
11121124
$childDefA = $container->registerForAutoconfiguration('AInterface');
11131125
$childDefB = $container->registerForAutoconfiguration('BInterface');
1114-
$this->assertSame(array('AInterface' => array($childDefA), 'BInterface' => array($childDefB)), $container->getAutomaticInstanceofDefinitions());
1126+
$this->assertSame(array('AInterface' => $childDefA, 'BInterface' => $childDefB), $container->getAutomaticInstanceofDefinitions());
1127+
1128+
// when called multiple times, the same instance is returned
1129+
$this->assertSame($childDefA, $container->registerForAutoconfiguration('AInterface'));
11151130
}
11161131
}
11171132

0 commit comments

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