[DI] deferred exceptions in ResolveParameterPlaceHoldersPass

This commit is contained in:
Islam93 2019-12-30 22:53:00 +03:00
parent aaf6915661
commit b3a2173c8e
3 changed files with 40 additions and 3 deletions

View File

@ -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(),

View File

@ -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)) {
$v = $this->bag->resolveValue($value); try {
$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;
} }

View File

@ -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();