Skip to content

Commit

Permalink
[DI] Fixes: #28326 - Overriding services autowired by name under _def…
Browse files Browse the repository at this point in the history
…aults bind not working
  • Loading branch information
przemyslaw-bogusz committed Jan 21, 2019
1 parent 5e9373b commit 85a28f1
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 0 deletions.
Expand Up @@ -34,6 +34,8 @@ class ResolveBindingsPass extends AbstractRecursivePass
*/
public function process(ContainerBuilder $container)
{
$this->usedBindings = $container->getRemovedBindingIds();

try {
parent::process($container);

Expand Down
26 changes: 26 additions & 0 deletions src/Symfony/Component/DependencyInjection/ContainerBuilder.php
Expand Up @@ -123,6 +123,8 @@ class ContainerBuilder extends Container implements TaggedContainerInterface

private $removedIds = [];

private $removedBindingIds = [];

private static $internalTypes = [
'int' => true,
'float' => true,
Expand Down Expand Up @@ -1504,6 +1506,30 @@ public function normalizeId($id)
return isset($this->definitions[$id]) || isset($this->aliasDefinitions[$id]) || isset($this->removedIds[$id]) ? $id : parent::normalizeId($id);
}

/**
* Gets removed binding ids.
*
* @return array
*
* @internal
*/
public function getRemovedBindingIds()
{
return $this->removedBindingIds;
}

/**
* Adds a removed binding id.
*
* @param int $id
*
* @internal
*/
public function addRemovedBindingId($id)
{
$this->removedBindingIds[(int) $id] = true;
}

/**
* Returns the Service Conditionals.
*
Expand Down
Expand Up @@ -91,6 +91,13 @@ public function registerClasses(Definition $prototype, $namespace, $resource, $e
*/
protected function setDefinition($id, Definition $definition)
{
if ($this->container->hasDefinition($id)) {
foreach ($this->container->getDefinition($id)->getBindings() as $key => $binding) {
list(, $bindingId) = $binding->getValues();
$this->container->addRemovedBindingId($bindingId);
}
}

if ($this->isLoadingInstanceof) {
if (!$definition instanceof ChildDefinition) {
throw new InvalidArgumentException(sprintf('Invalid type definition "%s": ChildDefinition expected, "%s" given.', $id, \get_class($definition)));
Expand Down
@@ -0,0 +1,11 @@
services:
_defaults:
bind:
$quz: value
$foo: [value]

bar:
class: Symfony\Component\DependencyInjection\Tests\Fixtures\Bar

foo:
class: Symfony\Component\DependencyInjection\Tests\Fixtures\FactoryDummy
@@ -0,0 +1,7 @@
services:
_defaults:
bind:
$quz: ~

bar:
class: Symfony\Component\DependencyInjection\Tests\Fixtures\Bar
Expand Up @@ -17,6 +17,7 @@
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\Config\Resource\GlobResource;
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
use Symfony\Component\DependencyInjection\Compiler\ResolveBindingsPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\IniFileLoader;
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
Expand Down Expand Up @@ -732,4 +733,20 @@ public function testBindings()
'$factory' => 'factory',
], array_map(function ($v) { return $v->getValues()[0]; }, $definition->getBindings()));
}

/**
* The pass may throw an exception, which will cause the test to fail.
*/
public function testOverriddenDefaultsBindings()
{
$container = new ContainerBuilder();

$loader = new YamlFileLoader($container, new FileLocator(self::$fixturesPath.'/yaml'));
$loader->load('defaults_bindings.yml');
$loader->load('defaults_bindings2.yml');

(new ResolveBindingsPass())->process($container);

$this->assertTrue(true);
}
}

0 comments on commit 85a28f1

Please sign in to comment.