feature #12526 Add an auto_alias compiler pass (Daniel Wehner)
This PR was submitted for the master branch but it was merged into the 2.7 branch instead (closes #12526).
Discussion
----------
Add an auto_alias compiler pass
Discussion see https://github.com/symfony/symfony/issues/11460
| Q | A
| ------------- | ---
| Bug fix? | no
| New feature? | yes
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | [#11460]
| License | MIT
| Doc PR |
Commits
-------
d7432c0
Add an auto_alias compiler pass
This commit is contained in:
commit
2d48266f6f
@ -0,0 +1,41 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\DependencyInjection\Compiler;
|
||||||
|
|
||||||
|
use Symfony\Component\DependencyInjection\Alias;
|
||||||
|
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||||
|
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a service to be an alias of another one, given a format pattern.
|
||||||
|
*/
|
||||||
|
class AutoAliasServicePass implements CompilerPassInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function process(ContainerBuilder $container)
|
||||||
|
{
|
||||||
|
foreach ($container->findTaggedServiceIds('auto_alias') as $serviceId => $tags) {
|
||||||
|
foreach ($tags as $tag) {
|
||||||
|
if (!isset($tag['format'])) {
|
||||||
|
throw new InvalidArgumentException(sprintf('Missing tag information "format" on auto_alias service "%s".', $serviceId));
|
||||||
|
}
|
||||||
|
|
||||||
|
$aliasId = $container->getParameterBag()->resolveValue($tag['format']);
|
||||||
|
if ($container->hasDefinition($aliasId) || $container->hasAlias($aliasId)) {
|
||||||
|
$container->setAlias($serviceId, new Alias($aliasId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,103 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Symfony\Component\DependencyInjection\Tests\Compiler;
|
||||||
|
|
||||||
|
use Symfony\Component\DependencyInjection\Compiler\AutoAliasServicePass;
|
||||||
|
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||||
|
|
||||||
|
class AutoAliasServicePassTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @expectedException \Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException
|
||||||
|
*/
|
||||||
|
public function testProcessWithMissingParameter()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
|
||||||
|
$container->register('example')
|
||||||
|
->addTag('auto_alias', array('format' => '%non_existing%.example'));
|
||||||
|
|
||||||
|
$pass = new AutoAliasServicePass();
|
||||||
|
$pass->process($container);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
|
||||||
|
*/
|
||||||
|
public function testProcessWithMissingFormat()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
|
||||||
|
$container->register('example')
|
||||||
|
->addTag('auto_alias', array());
|
||||||
|
$container->setParameter('existing', 'mysql');
|
||||||
|
|
||||||
|
$pass = new AutoAliasServicePass();
|
||||||
|
$pass->process($container);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testProcessWithNonExistingAlias()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
|
||||||
|
$container->register('example', 'Symfony\Component\DependencyInjection\Tests\Compiler\ServiceClassDefault')
|
||||||
|
->addTag('auto_alias', array('format' => '%existing%.example'));
|
||||||
|
$container->setParameter('existing', 'mysql');
|
||||||
|
|
||||||
|
$pass = new AutoAliasServicePass();
|
||||||
|
$pass->process($container);
|
||||||
|
|
||||||
|
$this->assertEquals('Symfony\Component\DependencyInjection\Tests\Compiler\ServiceClassDefault', $container->getDefinition('example')->getClass());
|
||||||
|
$this->assertInstanceOf('Symfony\Component\DependencyInjection\Tests\Compiler\ServiceClassDefault', $container->get('example'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testProcessWithExistingAlias()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
|
||||||
|
$container->register('example', 'Symfony\Component\DependencyInjection\Tests\Compiler\ServiceClassDefault')
|
||||||
|
->addTag('auto_alias', array('format' => '%existing%.example'));
|
||||||
|
|
||||||
|
$container->register('mysql.example', 'Symfony\Component\DependencyInjection\Tests\Compiler\ServiceClassMysql');
|
||||||
|
$container->setParameter('existing', 'mysql');
|
||||||
|
|
||||||
|
$pass = new AutoAliasServicePass();
|
||||||
|
$pass->process($container);
|
||||||
|
|
||||||
|
$this->assertTrue($container->hasAlias('example'));
|
||||||
|
$this->assertEquals('mysql.example', $container->getAlias('example'));
|
||||||
|
$this->assertInstanceOf('Symfony\Component\DependencyInjection\Tests\Compiler\ServiceClassMysql', $container->get('example'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testProcessWithManualAlias()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
|
||||||
|
$container->register('example', 'Symfony\Component\DependencyInjection\Tests\Compiler\ServiceClassDefault')
|
||||||
|
->addTag('auto_alias', array('format' => '%existing%.example'));
|
||||||
|
|
||||||
|
$container->register('mysql.example', 'Symfony\Component\DependencyInjection\Tests\Compiler\ServiceClassMysql');
|
||||||
|
$container->register('mariadb.example', 'Symfony\Component\DependencyInjection\Tests\Compiler\ServiceClassMariadb');
|
||||||
|
$container->setAlias('example', 'mariadb.example');
|
||||||
|
$container->setParameter('existing', 'mysql');
|
||||||
|
|
||||||
|
$pass = new AutoAliasServicePass();
|
||||||
|
$pass->process($container);
|
||||||
|
|
||||||
|
$this->assertTrue($container->hasAlias('example'));
|
||||||
|
$this->assertEquals('mariadb.example', $container->getAlias('example'));
|
||||||
|
$this->assertInstanceOf('Symfony\Component\DependencyInjection\Tests\Compiler\ServiceClassMariaDb', $container->get('example'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ServiceClassDefault
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
class ServiceClassMysql extends ServiceClassDefault
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
class ServiceClassMariaDb extends ServiceClassMysql
|
||||||
|
{
|
||||||
|
}
|
Reference in New Issue
Block a user