/** * Resolve a definition and return the resulting value. * * @param DefinitionInterface $definition * * @return mixed * * @throws UnsupportedDefinition * @throws InvalidDefinition * @throws EntryNotFound A dependency was not found. */ public function resolve(DefinitionInterface $definition) { switch (true) { case $definition instanceof ReferenceDefinitionInterface: return $this->container->get($definition->getTarget()); case $definition instanceof ParameterDefinitionInterface: return $definition->getValue(); case $definition instanceof ObjectDefinitionInterface: $reflection = new \ReflectionClass($definition->getClassName()); // Create the instance $constructorArguments = $definition->getConstructorArguments(); $constructorArguments = array_map([$this, 'resolveSubDefinition'], $constructorArguments); $service = $reflection->newInstanceArgs($constructorArguments); // Set properties foreach ($definition->getPropertyAssignments() as $propertyAssignment) { $propertyName = $propertyAssignment->getPropertyName(); $service->{$propertyName} = $this->resolveSubDefinition($propertyAssignment->getValue()); } // Call methods foreach ($definition->getMethodCalls() as $methodCall) { $methodArguments = $methodCall->getArguments(); $methodArguments = array_map([$this, 'resolveSubDefinition'], $methodArguments); call_user_func_array([$service, $methodCall->getMethodName()], $methodArguments); } return $service; case $definition instanceof FactoryCallDefinitionInterface: $factory = $definition->getFactory(); $methodName = $definition->getMethodName(); $arguments = (array) $definition->getArguments(); $arguments = array_map([$this, 'resolveSubDefinition'], $arguments); if (is_string($factory)) { return call_user_func_array([$factory, $methodName], $arguments); } elseif ($factory instanceof ReferenceDefinitionInterface) { $factory = $this->container->get($factory->getTarget()); return call_user_func_array([$factory, $methodName], $arguments); } throw new InvalidDefinition(sprintf('Definition "%s" does not return a valid factory')); default: throw UnsupportedDefinition::fromDefinition($definition); } }
/** * Resolve a definition and return the resulting value. * * @param DefinitionInterface $definition * @return mixed * @throws UnsupportedDefinition * @throws EntryNotFound A dependency was not found. */ private function resolveDefinition(DefinitionInterface $definition, $requestedId) { switch (true) { case $definition instanceof ParameterDefinitionInterface: return $definition->getValue(); case $definition instanceof InstanceDefinition: $reflection = new \ReflectionClass($definition->getClassName()); // Create the instance $constructorArguments = $definition->getConstructorArguments(); $constructorArguments = array_map([$this, 'resolveReference'], $constructorArguments); $service = $reflection->newInstanceArgs($constructorArguments); // Set properties foreach ($definition->getPropertyAssignments() as $propertyAssignment) { $propertyName = $propertyAssignment->getPropertyName(); $service->{$propertyName} = $this->resolveReference($propertyAssignment->getValue()); } // Call methods foreach ($definition->getMethodCalls() as $methodCall) { $methodArguments = $methodCall->getArguments(); $methodArguments = array_map([$this, 'resolveReference'], $methodArguments); call_user_func_array([$service, $methodCall->getMethodName()], $methodArguments); } return $service; case $definition instanceof AliasDefinitionInterface: return $this->get($definition->getTarget()); case $definition instanceof FactoryDefinitionInterface: $factory = $this->get($definition->getReference()->getTarget()); $methodName = $definition->getMethodName(); return $factory->{$methodName}($requestedId); default: throw UnsupportedDefinition::fromDefinition($definition); } }