Skip to content

Commit 6b80750

Browse files
committed
[DI] deferred exceptions in ResolveParameterPlaceHoldersPass
1 parent aa9ccf8 commit 6b80750

File tree

3 files changed

+40
-3
lines changed

3 files changed

+40
-3
lines changed

src/Symfony/Component/DependencyInjection/Compiler/PassConfig.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public function __construct()
5252
new ValidateEnvPlaceholdersPass(),
5353
new ResolveChildDefinitionsPass(),
5454
new RegisterServiceSubscribersPass(),
55-
new ResolveParameterPlaceHoldersPass(false),
55+
new ResolveParameterPlaceHoldersPass(false, false),
5656
new ResolveFactoryClassPass(),
5757
new ResolveNamedArgumentsPass(),
5858
new AutowireRequiredMethodsPass(),

src/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@ class ResolveParameterPlaceHoldersPass extends AbstractRecursivePass
2424
{
2525
private $bag;
2626
private $resolveArrays;
27+
private $throwOnResolveException;
2728

28-
public function __construct(bool $resolveArrays = true)
29+
public function __construct(bool $resolveArrays = true, bool $throwOnResolveException = true)
2930
{
3031
$this->resolveArrays = $resolveArrays;
32+
$this->throwOnResolveException = $throwOnResolveException;
3133
}
3234

3335
/**
@@ -61,7 +63,16 @@ public function process(ContainerBuilder $container)
6163
protected function processValue($value, bool $isRoot = false)
6264
{
6365
if (\is_string($value)) {
64-
$v = $this->bag->resolveValue($value);
66+
try {
67+
$v = $this->bag->resolveValue($value);
68+
} catch (ParameterNotFoundException $e) {
69+
if ($this->throwOnResolveException) {
70+
throw $e;
71+
}
72+
73+
$v = null;
74+
$this->container->getDefinition($this->currentId)->addError($e->getMessage());
75+
}
6576

6677
return $this->resolveArrays || !$v || !\is_array($v) ? $v : $value;
6778
}

src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveParameterPlaceHoldersPassTest.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Component\DependencyInjection\Compiler\ResolveParameterPlaceHoldersPass;
1616
use Symfony\Component\DependencyInjection\ContainerBuilder;
17+
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
1718

1819
class ResolveParameterPlaceHoldersPassTest extends TestCase
1920
{
@@ -71,6 +72,31 @@ public function testBindingsShouldBeResolved()
7172
$this->assertSame($this->container->getParameterBag()->resolveValue('%env(BAZ)%'), $boundValue);
7273
}
7374

75+
public function testParameterNotFoundExceptionsIsThrown()
76+
{
77+
$this->expectException(ParameterNotFoundException::class);
78+
$this->expectExceptionMessage('The service "baz_service_id" has a dependency on a non-existent parameter "non_existent_param".');
79+
80+
$containerBuilder = new ContainerBuilder();
81+
$definition = $containerBuilder->register('baz_service_id');
82+
$definition->setArgument(0, '%non_existent_param%');
83+
84+
$pass = new ResolveParameterPlaceHoldersPass();
85+
$pass->process($containerBuilder);
86+
}
87+
88+
public function testParameterNotFoundExceptionsIsNotThrown()
89+
{
90+
$containerBuilder = new ContainerBuilder();
91+
$definition = $containerBuilder->register('baz_service_id');
92+
$definition->setArgument(0, '%non_existent_param%');
93+
94+
$pass = new ResolveParameterPlaceHoldersPass(true, false);
95+
$pass->process($containerBuilder);
96+
97+
$this->assertCount(1, $definition->getErrors());
98+
}
99+
74100
private function createContainerBuilder(): ContainerBuilder
75101
{
76102
$containerBuilder = new ContainerBuilder();

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy