[DI] Throw when a service name or an alias contains dynamic values (prevent an infinite loop)
This commit is contained in:
parent
e6d949b233
commit
14e30857ea
@ -12,6 +12,7 @@
|
|||||||
namespace Symfony\Component\DependencyInjection\Compiler;
|
namespace Symfony\Component\DependencyInjection\Compiler;
|
||||||
|
|
||||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||||
|
use Symfony\Component\DependencyInjection\Exception\EnvParameterException;
|
||||||
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
|
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -75,6 +76,18 @@ class CheckDefinitionValidityPass implements CompilerPassInterface
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$resolvedId = $container->resolveEnvPlaceholders($id, null, $usedEnvs);
|
||||||
|
if (null !== $usedEnvs) {
|
||||||
|
throw new EnvParameterException(array($resolvedId), null, 'A service name ("%s") cannot contain dynamic values.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($container->getAliases() as $id => $alias) {
|
||||||
|
$resolvedId = $container->resolveEnvPlaceholders($id, null, $usedEnvs);
|
||||||
|
if (null !== $usedEnvs) {
|
||||||
|
throw new EnvParameterException(array($resolvedId), null, 'An alias name ("%s") cannot contain dynamic values.');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,6 +76,30 @@ class CheckDefinitionValidityPassTest extends TestCase
|
|||||||
$this->process($container);
|
$this->process($container);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \Symfony\Component\DependencyInjection\Exception\EnvParameterException
|
||||||
|
*/
|
||||||
|
public function testDynamicServiceName()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
$env = $container->getParameterBag()->get('env(BAR)');
|
||||||
|
$container->register("foo.$env", 'class');
|
||||||
|
|
||||||
|
$this->process($container);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \Symfony\Component\DependencyInjection\Exception\EnvParameterException
|
||||||
|
*/
|
||||||
|
public function testDynamicAliasName()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
$env = $container->getParameterBag()->get('env(BAR)');
|
||||||
|
$container->setAlias("foo.$env", 'class');
|
||||||
|
|
||||||
|
$this->process($container);
|
||||||
|
}
|
||||||
|
|
||||||
protected function process(ContainerBuilder $container)
|
protected function process(ContainerBuilder $container)
|
||||||
{
|
{
|
||||||
$pass = new CheckDefinitionValidityPass();
|
$pass = new CheckDefinitionValidityPass();
|
||||||
|
Reference in New Issue
Block a user