[DI] fix detecting singly implemented interfaces

This commit is contained in:
Nicolas Grekas 2019-11-13 22:44:24 +01:00
parent 29a2f17124
commit eccb937d97
2 changed files with 10 additions and 7 deletions

View File

@ -112,7 +112,7 @@ abstract class FileLoader extends BaseFileLoader
continue;
}
foreach (class_implements($class, false) as $interface) {
$this->singlyImplemented[$interface] = isset($this->singlyImplemented[$interface]) ? false : $class;
$this->singlyImplemented[$interface] = ($this->singlyImplemented[$interface] ?? $class) !== $class ? false : $class;
}
}
}

View File

@ -91,6 +91,8 @@ class FileLoaderTest extends TestCase
$loader = new TestFileLoader($container, new FileLocator(self::$fixturesPath.'/Fixtures'));
$loader->registerClasses(new Definition(), 'Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Sub\\', 'Prototype/%sub_dir%/*');
$loader->registerClasses(new Definition(), 'Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\Sub\\', 'Prototype/%sub_dir%/*'); // loading twice should not be an issue
$loader->registerAliasesForSinglyImplementedInterfaces();
$this->assertEquals(
['service_container', Bar::class],
@ -119,6 +121,7 @@ class FileLoaderTest extends TestCase
// load everything, except OtherDir/AnotherSub & Foo.php
'Prototype/{%other_dir%/AnotherSub,Foo.php}'
);
$loader->registerAliasesForSinglyImplementedInterfaces();
$this->assertTrue($container->has(Bar::class));
$this->assertTrue($container->has(Baz::class));
@ -148,6 +151,8 @@ class FileLoaderTest extends TestCase
'Prototype/OtherDir/AnotherSub/DeeperBaz.php',
]
);
$loader->registerAliasesForSinglyImplementedInterfaces();
$this->assertTrue($container->has(Foo::class));
$this->assertTrue($container->has(Baz::class));
$this->assertFalse($container->has(Bar::class));
@ -162,6 +167,7 @@ class FileLoaderTest extends TestCase
$prototype = new Definition();
$prototype->setPublic(true)->setPrivate(true);
$loader->registerClasses($prototype, 'Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\\', 'Prototype/*');
$loader->registerAliasesForSinglyImplementedInterfaces();
$this->assertTrue($container->has(Bar::class));
$this->assertTrue($container->has(Baz::class));
@ -193,6 +199,7 @@ class FileLoaderTest extends TestCase
'Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\BadClasses\\',
'Prototype/%bad_classes_dir%/*'
);
$loader->registerAliasesForSinglyImplementedInterfaces();
$this->assertTrue($container->has(MissingParent::class));
@ -211,6 +218,7 @@ class FileLoaderTest extends TestCase
// the Sub is missing from namespace prefix
$loader->registerClasses(new Definition(), 'Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\\', 'Prototype/Sub/*');
$loader->registerAliasesForSinglyImplementedInterfaces();
}
public function testRegisterClassesWithIncompatibleExclude()
@ -226,6 +234,7 @@ class FileLoaderTest extends TestCase
'Prototype/*',
'yaml/*'
);
$loader->registerAliasesForSinglyImplementedInterfaces();
}
}
@ -240,10 +249,4 @@ class TestFileLoader extends FileLoader
{
return false;
}
public function registerClasses(Definition $prototype, $namespace, $resource, $exclude = null)
{
parent::registerClasses($prototype, $namespace, $resource, $exclude);
$this->registerAliasesForSinglyImplementedInterfaces();
}
}