Nelmio\Alice\Generator\Resolver\Parameter\Chainable\RecursiveParameterResolver::resolve PHP Method

resolve() public method

public resolve ( Parameter $parameter, ParameterBag $unresolvedParameters, ParameterBag $resolvedParameters, ResolvingContext $context = null, ParameterBag $previousResult = null, integer $counter = 1 ) : ParameterBag
$parameter Nelmio\Alice\Parameter
$unresolvedParameters Nelmio\Alice\ParameterBag
$resolvedParameters Nelmio\Alice\ParameterBag
$context Nelmio\Alice\Generator\Resolver\ResolvingContext
$previousResult Nelmio\Alice\ParameterBag
$counter integer
return Nelmio\Alice\ParameterBag
    public function resolve(Parameter $parameter, ParameterBag $unresolvedParameters, ParameterBag $resolvedParameters, ResolvingContext $context = null, ParameterBag $previousResult = null, int $counter = 1) : ParameterBag
    {
        if (null === $previousResult) {
            $result = $this->resolver->resolve($parameter, $unresolvedParameters, $resolvedParameters, $context);
            return $this->resolve($parameter, $unresolvedParameters, $resolvedParameters, $context, $result);
        }
        $parameterKey = $parameter->getKey();
        $previousParameterValue = $previousResult->get($parameterKey);
        $counter = $this->incrementCounter($counter, $this->limit, $parameterKey);
        $newResult = $this->resolver->resolve($parameter->withValue($previousParameterValue), $unresolvedParameters, $resolvedParameters, $context);
        $newParameterValue = $newResult->get($parameterKey);
        $result = $this->mergeResults($previousResult, $newResult);
        if ($previousParameterValue === $newParameterValue) {
            return $result;
        }
        return $this->resolve($parameter, $unresolvedParameters, $resolvedParameters, $context, $result, $counter);
    }

Usage Example

 public function testThrowsAnExceptionWhenRecursionLimitIsReached()
 {
     $parameter = new Parameter('foo', null);
     $unresolvedParameters = new ParameterBag();
     $resolvedParameters = new ParameterBag();
     $context = new ResolvingContext('foo');
     $decoratedResolverProphecy = $this->prophesize(ChainableParameterResolverInterface::class);
     $decoratedResolverProphecy->resolve(Argument::cetera())->will(function ($args) {
         $hash = spl_object_hash($args[0]);
         return new ParameterBag(['foo' => uniqid($hash)]);
     });
     /* @var ChainableParameterResolverInterface $decoratedResolver */
     $decoratedResolver = $decoratedResolverProphecy->reveal();
     $resolver = new RecursiveParameterResolver($decoratedResolver);
     try {
         $resolver->resolve($parameter, $unresolvedParameters, $resolvedParameters, $context);
         $this->fail('Expected exception to be thrown.');
     } catch (RecursionLimitReachedException $exception) {
         $this->assertEquals('Recursion limit (5 tries) reached while resolving the parameter "foo"', $exception->getMessage());
         $decoratedResolverProphecy->resolve(Argument::cetera())->shouldHaveBeenCalledTimes(5);
     }
     $resolver = new RecursiveParameterResolver($decoratedResolver, 10);
     try {
         $resolver->resolve($parameter, $unresolvedParameters, $resolvedParameters, $context);
         $this->fail('Expected exception to be thrown.');
     } catch (RecursionLimitReachedException $exception) {
         $this->assertEquals('Recursion limit (10 tries) reached while resolving the parameter "foo"', $exception->getMessage());
         $decoratedResolverProphecy->resolve(Argument::cetera())->shouldHaveBeenCalledTimes(15);
     }
 }