bug #34729 [DI] auto-register singly implemented interfaces by default (nicolas-grekas)
This PR was merged into the 4.4 branch.
Discussion
----------
[DI] auto-register singly implemented interfaces by default
| Q | A
| ------------- | ---
| Branch? | 4.4
| Bug fix? | yes
| New feature? | no
| Deprecations? | no
| Tickets | Fix #34524
| License | MIT
| Doc PR | -
Commits
-------
209b330fd6
[DI] auto-register singly implemented interfaces by default
This commit is contained in:
commit
9b658ed4a2
@ -36,6 +36,7 @@ abstract class FileLoader extends BaseFileLoader
|
||||
protected $instanceof = [];
|
||||
protected $interfaces = [];
|
||||
protected $singlyImplemented = [];
|
||||
protected $autoRegisterAliasesForSinglyImplementedInterfaces = true;
|
||||
|
||||
public function __construct(ContainerBuilder $container, FileLocatorInterface $locator)
|
||||
{
|
||||
@ -116,6 +117,10 @@ abstract class FileLoader extends BaseFileLoader
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->autoRegisterAliasesForSinglyImplementedInterfaces) {
|
||||
$this->registerAliasesForSinglyImplementedInterfaces();
|
||||
}
|
||||
}
|
||||
|
||||
public function registerAliasesForSinglyImplementedInterfaces()
|
||||
|
@ -23,6 +23,8 @@ use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigura
|
||||
*/
|
||||
class PhpFileLoader extends FileLoader
|
||||
{
|
||||
protected $autoRegisterAliasesForSinglyImplementedInterfaces = false;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
@ -36,6 +36,8 @@ class XmlFileLoader extends FileLoader
|
||||
{
|
||||
const NS = 'http://symfony.com/schema/dic/services';
|
||||
|
||||
protected $autoRegisterAliasesForSinglyImplementedInterfaces = false;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
@ -110,6 +110,8 @@ class YamlFileLoader extends FileLoader
|
||||
private $anonymousServicesCount;
|
||||
private $anonymousServicesSuffix;
|
||||
|
||||
protected $autoRegisterAliasesForSinglyImplementedInterfaces = false;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
@ -89,6 +89,7 @@ class FileLoaderTest extends TestCase
|
||||
$container = new ContainerBuilder();
|
||||
$container->setParameter('sub_dir', 'Sub');
|
||||
$loader = new TestFileLoader($container, new FileLocator(self::$fixturesPath.'/Fixtures'));
|
||||
$loader->autoRegisterAliasesForSinglyImplementedInterfaces = false;
|
||||
|
||||
$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
|
||||
@ -121,7 +122,6 @@ 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));
|
||||
@ -151,7 +151,6 @@ class FileLoaderTest extends TestCase
|
||||
'Prototype/OtherDir/AnotherSub/DeeperBaz.php',
|
||||
]
|
||||
);
|
||||
$loader->registerAliasesForSinglyImplementedInterfaces();
|
||||
|
||||
$this->assertTrue($container->has(Foo::class));
|
||||
$this->assertTrue($container->has(Baz::class));
|
||||
@ -167,7 +166,6 @@ 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));
|
||||
@ -199,7 +197,6 @@ class FileLoaderTest extends TestCase
|
||||
'Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\BadClasses\\',
|
||||
'Prototype/%bad_classes_dir%/*'
|
||||
);
|
||||
$loader->registerAliasesForSinglyImplementedInterfaces();
|
||||
|
||||
$this->assertTrue($container->has(MissingParent::class));
|
||||
|
||||
@ -218,7 +215,6 @@ 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()
|
||||
@ -234,12 +230,13 @@ class FileLoaderTest extends TestCase
|
||||
'Prototype/*',
|
||||
'yaml/*'
|
||||
);
|
||||
$loader->registerAliasesForSinglyImplementedInterfaces();
|
||||
}
|
||||
}
|
||||
|
||||
class TestFileLoader extends FileLoader
|
||||
{
|
||||
public $autoRegisterAliasesForSinglyImplementedInterfaces = true;
|
||||
|
||||
public function load($resource, $type = null)
|
||||
{
|
||||
return $resource;
|
||||
|
Reference in New Issue
Block a user