[DependencyInjection] resolve array env vars
This commit is contained in:
parent
fb881194b6
commit
4c3b950dc2
@ -1408,6 +1408,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
|
||||
}
|
||||
$envPlaceholders = $bag instanceof EnvPlaceholderParameterBag ? $bag->getEnvPlaceholders() : $this->envPlaceholders;
|
||||
|
||||
$completed = false;
|
||||
foreach ($envPlaceholders as $env => $placeholders) {
|
||||
foreach ($placeholders as $placeholder) {
|
||||
if (false !== stripos($value, $placeholder)) {
|
||||
@ -1418,14 +1419,19 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
|
||||
}
|
||||
if ($placeholder === $value) {
|
||||
$value = $resolved;
|
||||
$completed = true;
|
||||
} else {
|
||||
if (!is_string($resolved) && !is_numeric($resolved)) {
|
||||
throw new RuntimeException(sprintf('A string value must be composed of strings and/or numbers, but found parameter "env(%s)" of type %s inside string value "%s".', $env, gettype($resolved), $value));
|
||||
throw new RuntimeException(sprintf('A string value must be composed of strings and/or numbers, but found parameter "env(%s)" of type %s inside string value "%s".', $env, gettype($resolved), $this->resolveEnvPlaceholders($value)));
|
||||
}
|
||||
$value = str_ireplace($placeholder, $resolved, $value);
|
||||
}
|
||||
$usedEnvs[$env] = $env;
|
||||
$this->envCounters[$env] = isset($this->envCounters[$env]) ? 1 + $this->envCounters[$env] : 1;
|
||||
|
||||
if ($completed) {
|
||||
break 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -665,17 +665,49 @@ class ContainerBuilderTest extends TestCase
|
||||
putenv('DUMMY_ENV_VAR');
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
|
||||
* @expectedExceptionMessage A string value must be composed of strings and/or numbers, but found parameter "env(ARRAY)" of type array inside string value "ABC %env(ARRAY)%".
|
||||
*/
|
||||
public function testCompileWithArrayResolveEnv()
|
||||
{
|
||||
$bag = new TestingEnvPlaceholderParameterBag();
|
||||
$container = new ContainerBuilder($bag);
|
||||
$container->setParameter('foo', '%env(ARRAY)%');
|
||||
$container->setParameter('bar', 'ABC %env(ARRAY)%');
|
||||
putenv('ARRAY={"foo":"bar"}');
|
||||
|
||||
$container = new ContainerBuilder();
|
||||
$container->setParameter('foo', '%env(json:ARRAY)%');
|
||||
$container->compile(true);
|
||||
|
||||
$this->assertSame(array('foo' => 'bar'), $container->getParameter('foo'));
|
||||
|
||||
putenv('ARRAY');
|
||||
}
|
||||
|
||||
public function testCompileWithArrayAndAnotherResolveEnv()
|
||||
{
|
||||
putenv('DUMMY_ENV_VAR=abc');
|
||||
putenv('ARRAY={"foo":"bar"}');
|
||||
|
||||
$container = new ContainerBuilder();
|
||||
$container->setParameter('foo', '%env(json:ARRAY)%');
|
||||
$container->setParameter('bar', '%env(DUMMY_ENV_VAR)%');
|
||||
$container->compile(true);
|
||||
|
||||
$this->assertSame(array('foo' => 'bar'), $container->getParameter('foo'));
|
||||
$this->assertSame('abc', $container->getParameter('bar'));
|
||||
|
||||
putenv('DUMMY_ENV_VAR');
|
||||
putenv('ARRAY');
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
|
||||
* @expectedExceptionMessage A string value must be composed of strings and/or numbers, but found parameter "env(json:ARRAY)" of type array inside string value "ABC %env(json:ARRAY)%".
|
||||
*/
|
||||
public function testCompileWithArrayInStringResolveEnv()
|
||||
{
|
||||
putenv('ARRAY={"foo":"bar"}');
|
||||
|
||||
$container = new ContainerBuilder();
|
||||
$container->setParameter('foo', 'ABC %env(json:ARRAY)%');
|
||||
$container->compile(true);
|
||||
|
||||
putenv('ARRAY');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1418,11 +1450,3 @@ class B
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
class TestingEnvPlaceholderParameterBag extends EnvPlaceholderParameterBag
|
||||
{
|
||||
public function get($name)
|
||||
{
|
||||
return 'env(array)' === strtolower($name) ? array(123) : parent::get($name);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user