Add an auto_alias compiler pass
This commit is contained in:
parent
eb4c3da6d1
commit
d7432c0241
@ -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