/** * Creates an instance of the class and injects dependencies.. * * @param ClassDefinition $classDefinition * @param array $parameters Optional parameters to use to create the instance. * * @throws DefinitionException * @throws DependencyException * @return object * * @todo Make private once PHP-DI supports PHP > 5.4 only */ public function createInstance(ClassDefinition $classDefinition, array $parameters) { if (!class_exists($classDefinition->getClassName()) && !interface_exists($classDefinition->getClassName())) { throw DefinitionException::create($classDefinition, sprintf("the class %s doesn't exist", $classDefinition->getClassName())); } $classReflection = new ReflectionClass($classDefinition->getClassName()); if (!$classReflection->isInstantiable()) { throw DefinitionException::create($classDefinition, sprintf("%s is not instantiable", $classDefinition->getClassName())); } $constructorInjection = $classDefinition->getConstructorInjection(); try { $instance = $this->injectConstructor($classDefinition, $classReflection, $constructorInjection, $parameters); $this->injectMethodsAndProperties($classDefinition, $instance, $classDefinition); } catch (NotFoundException $e) { throw new DependencyException(sprintf("Error while injecting dependencies into %s: %s", $classReflection->getName(), $e->getMessage()), 0, $e); } return $instance; }
/** * Fixes parameters indexed by the parameter name -> reindex by position. * * This is necessary so that merging definitions between sources is possible. * * @param ClassDefinition $definition * @param string $method * @param array $parameters * @return array */ private function fixParameters(ClassDefinition $definition, $method, $parameters) { $fixedParameters = array(); foreach ($parameters as $index => $parameter) { // Parameter indexed by the parameter name, we reindex it with its position if (is_string($index)) { $callable = array($definition->getClassName(), $method); $reflectionParameter = new \ReflectionParameter($callable, $index); $index = $reflectionParameter->getPosition(); } $fixedParameters[$index] = $parameter; } return $fixedParameters; }
private function assertClassExists(ClassDefinition $classDefinition) { if (!class_exists($classDefinition->getClassName()) && !interface_exists($classDefinition->getClassName())) { throw DefinitionException::create($classDefinition, sprintf("Entry %s cannot be resolved: class %s doesn't exist", $classDefinition->getName(), $classDefinition->getClassName())); } }