Returns the existing instance if is an object or create a new one otherwise. It also ensure that the key will be
added also it won't increment the counter if already present.
public static createFrom ( self $resolving = null, string $key ) : self | ||
$resolving | self | |
$key | string | |
return | self |
/** * {@inheritdoc} * * @param Parameter $parameter * * @throws ParameterNotFoundException */ public function resolve(Parameter $parameter, ParameterBag $unresolvedParameters, ParameterBag $resolvedParameters, ResolvingContext $context = null) : ParameterBag { $context = ResolvingContext::createFrom($context, $parameter->getKey()); $self = $this; $value = preg_replace_callback(self::PATTERN, function ($match) use($self, $context, $unresolvedParameters, &$resolvedParameters, $parameter) { $key = $match['parameter']; $resolvedParameters = $self->resolveStringKey($self->resolver, $parameter, $key, $unresolvedParameters, $resolvedParameters, $context); return $resolvedParameters->get($key); }, $parameter->getValue()); return $resolvedParameters->with($parameter->withValue($value)); }
public function testFactoryMethodCannotTriggerACircularReference() { $context = new ResolvingContext('foo'); $context->checkForCircularReference('foo'); $context = ResolvingContext::createFrom($context, 'foo'); $context->checkForCircularReference('foo'); $context = ResolvingContext::createFrom($context, 'foo'); $context->checkForCircularReference('foo'); $context->add('foo'); try { $context->checkForCircularReference('foo'); $this->fail('Expected exception to be thrown.'); } catch (CircularReferenceException $exception) { // Expected result } }
/** * @inheritdoc */ public function resolve(Parameter $unresolvedArrayParameter, ParameterBag $unresolvedParameters, ParameterBag $resolvedParameters, ResolvingContext $context = null) : ParameterBag { if (null === $this->resolver) { throw ResolverNotFoundExceptionFactory::createUnexpectedCall(__METHOD__); } $context = ResolvingContext::createFrom($context, $unresolvedArrayParameter->getKey()); $resolvedArray = []; /* @var array $unresolvedArray */ $unresolvedArray = $unresolvedArrayParameter->getValue(); foreach ($unresolvedArray as $index => $unresolvedValue) { // Iterate over all the values of the array to resolve each of them $resolvedParameters = $this->resolver->resolve(new Parameter((string) $index, $unresolvedValue), $unresolvedParameters, $resolvedParameters, $context); $resolvedArray[$index] = $resolvedParameters->get((string) $index); $resolvedParameters = $resolvedParameters->without((string) $index); } $resolvedParameters = $resolvedParameters->with($unresolvedArrayParameter->withValue($resolvedArray)); return $resolvedParameters; }