Skip to content

Commit

Permalink
bug #37193 [DependencyInjection][CheckTypeDeclarationsPass] Always re…
Browse files Browse the repository at this point in the history
…solve parameters (fancyweb)

This PR was merged into the 4.4 branch.

Discussion
----------

[DependencyInjection][CheckTypeDeclarationsPass] Always resolve parameters

| Q             | A
| ------------- | ---
| Branch?       | 4.4
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | #37166
| License       | MIT
| Doc PR        | -

> Only array parameters are not inlined when dumped.

This is true only when the XML debug container is used, not on a live container that can contain unresolved parameters in the `%my_param%` form. That was my mistake. We have to resolve to get the parameter type.

`$value = [];` was just an improvement to avoid useless parameter resolve btw.

Commits
-------

da0e2c3 [DependencyInjection][CheckTypeDeclarationsPass] Always resolve parameters
  • Loading branch information
fabpot committed Jun 11, 2020
2 parents 7107080 + da0e2c3 commit b1f2a14
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 16 deletions.
Expand Up @@ -198,8 +198,7 @@ private function checkType(Definition $checkedDefinition, $value, \ReflectionPar
}
} elseif (\is_string($value)) {
if ('%' === ($value[0] ?? '') && preg_match('/^%([^%]+)%$/', $value, $match)) {
// Only array parameters are not inlined when dumped.
$value = [];
$value = $this->container->getParameter(substr($value, 1, -1));
} elseif ($envPlaceholderUniquePrefix && false !== strpos($value, 'env_')) {
// If the value is an env placeholder that is either mixed with a string or with another env placeholder, then its resolved value will always be a string, so we don't need to resolve it.
// We don't need to change the value because it is already a string.
Expand Down
Expand Up @@ -612,20 +612,6 @@ public function testProcessThrowsOnIterableTypeWhenScalarPassed()
$this->assertInstanceOf(\stdClass::class, $container->get('bar')->foo);
}

public function testProcessResolveArrayParameters()
{
$container = new ContainerBuilder();
$container->setParameter('ccc', ['foobar']);

$container
->register('foobar', BarMethodCall::class)
->addMethodCall('setArray', ['%ccc%']);

(new CheckTypeDeclarationsPass(true))->process($container);

$this->addToAssertionCount(1);
}

public function testProcessResolveExpressions()
{
$container = new ContainerBuilder();
Expand Down Expand Up @@ -791,4 +777,20 @@ public function testExpressionLanguageWithSyntheticService()

$this->addToAssertionCount(1);
}

public function testProcessResolveParameters()
{
$container = new ContainerBuilder();
$container->setParameter('array_param', ['foobar']);
$container->setParameter('string_param', 'ccc');

$container
->register('foobar', BarMethodCall::class)
->addMethodCall('setArray', ['%array_param%'])
->addMethodCall('setString', ['%string_param%']);

(new CheckTypeDeclarationsPass(true))->process($container);

$this->addToAssertionCount(1);
}
}
Expand Up @@ -44,4 +44,8 @@ public function setCallable(callable $callable): void
public function setClosure(\Closure $closure): void
{
}

public function setString(string $string)
{
}
}

0 comments on commit b1f2a14

Please sign in to comment.