[DI] deferred exceptions in ResolveParameterPlaceHoldersPass
This commit is contained in:
parent
aaf6915661
commit
b3a2173c8e
@ -53,7 +53,7 @@ class PassConfig
|
|||||||
new ServiceLocatorTagPass(),
|
new ServiceLocatorTagPass(),
|
||||||
new RegisterServiceSubscribersPass(),
|
new RegisterServiceSubscribersPass(),
|
||||||
new DecoratorServicePass(),
|
new DecoratorServicePass(),
|
||||||
new ResolveParameterPlaceHoldersPass(false),
|
new ResolveParameterPlaceHoldersPass(false, false),
|
||||||
new ResolveFactoryClassPass(),
|
new ResolveFactoryClassPass(),
|
||||||
new FactoryReturnTypePass($resolveClassPass),
|
new FactoryReturnTypePass($resolveClassPass),
|
||||||
new CheckDefinitionValidityPass(),
|
new CheckDefinitionValidityPass(),
|
||||||
|
@ -24,10 +24,12 @@ class ResolveParameterPlaceHoldersPass extends AbstractRecursivePass
|
|||||||
{
|
{
|
||||||
private $bag;
|
private $bag;
|
||||||
private $resolveArrays;
|
private $resolveArrays;
|
||||||
|
private $throwOnResolveException;
|
||||||
|
|
||||||
public function __construct($resolveArrays = true)
|
public function __construct($resolveArrays = true, $throwOnResolveException = true)
|
||||||
{
|
{
|
||||||
$this->resolveArrays = $resolveArrays;
|
$this->resolveArrays = $resolveArrays;
|
||||||
|
$this->throwOnResolveException = $throwOnResolveException;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -61,7 +63,16 @@ class ResolveParameterPlaceHoldersPass extends AbstractRecursivePass
|
|||||||
protected function processValue($value, $isRoot = false)
|
protected function processValue($value, $isRoot = false)
|
||||||
{
|
{
|
||||||
if (\is_string($value)) {
|
if (\is_string($value)) {
|
||||||
|
try {
|
||||||
$v = $this->bag->resolveValue($value);
|
$v = $this->bag->resolveValue($value);
|
||||||
|
} catch (ParameterNotFoundException $e) {
|
||||||
|
if ($this->throwOnResolveException) {
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
|
||||||
|
$v = null;
|
||||||
|
$this->container->getDefinition($this->currentId)->addError($e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
return $this->resolveArrays || !$v || !\is_array($v) ? $v : $value;
|
return $this->resolveArrays || !$v || !\is_array($v) ? $v : $value;
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ namespace Symfony\Component\DependencyInjection\Tests\Compiler;
|
|||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Symfony\Component\DependencyInjection\Compiler\ResolveParameterPlaceHoldersPass;
|
use Symfony\Component\DependencyInjection\Compiler\ResolveParameterPlaceHoldersPass;
|
||||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||||
|
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
|
||||||
|
|
||||||
class ResolveParameterPlaceHoldersPassTest extends TestCase
|
class ResolveParameterPlaceHoldersPassTest extends TestCase
|
||||||
{
|
{
|
||||||
@ -71,6 +72,31 @@ class ResolveParameterPlaceHoldersPassTest extends TestCase
|
|||||||
$this->assertSame($this->container->getParameterBag()->resolveValue('%env(BAZ)%'), $boundValue);
|
$this->assertSame($this->container->getParameterBag()->resolveValue('%env(BAZ)%'), $boundValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testParameterNotFoundExceptionsIsThrown()
|
||||||
|
{
|
||||||
|
$this->expectException(ParameterNotFoundException::class);
|
||||||
|
$this->expectExceptionMessage('The service "baz_service_id" has a dependency on a non-existent parameter "non_existent_param".');
|
||||||
|
|
||||||
|
$containerBuilder = new ContainerBuilder();
|
||||||
|
$definition = $containerBuilder->register('baz_service_id');
|
||||||
|
$definition->setArgument(0, '%non_existent_param%');
|
||||||
|
|
||||||
|
$pass = new ResolveParameterPlaceHoldersPass();
|
||||||
|
$pass->process($containerBuilder);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testParameterNotFoundExceptionsIsNotThrown()
|
||||||
|
{
|
||||||
|
$containerBuilder = new ContainerBuilder();
|
||||||
|
$definition = $containerBuilder->register('baz_service_id');
|
||||||
|
$definition->setArgument(0, '%non_existent_param%');
|
||||||
|
|
||||||
|
$pass = new ResolveParameterPlaceHoldersPass(true, false);
|
||||||
|
$pass->process($containerBuilder);
|
||||||
|
|
||||||
|
$this->assertCount(1, $definition->getErrors());
|
||||||
|
}
|
||||||
|
|
||||||
private function createContainerBuilder()
|
private function createContainerBuilder()
|
||||||
{
|
{
|
||||||
$containerBuilder = new ContainerBuilder();
|
$containerBuilder = new ContainerBuilder();
|
||||||
|
Reference in New Issue
Block a user