public resolve ( |
||
$parameter | ||
$unresolvedParameters | ||
$resolvedParameters | ||
$context | ||
$previousResult | ||
$counter | integer | |
Результат |
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);
}
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); } }