/** * Realiza la carga de una dependencia que luego va a ser inyectada * @param string $name * @param array $dependencyDefinition * @param array &$loadedDependencies * @return type */ protected function loadDependency($name, $dependencyDefinition, &$loadedDependencies = array()) { $newInstance = NULL; //Si es singleton analiza si existe y si puede devuelve la msima if (isset($this->singletons[$name])) { $newInstance = $this->singletons[$name]; } else { //Veo si tiene namespace y si tiene le agrego el mismo $namespace = isset($dependencyDefinition['namespace']) ? $dependencyDefinition['namespace'] : ''; $dir = explode("/", $dependencyDefinition['class']); $class = $dir[count($dir) - 1]; if ($namespace != '') { $class = "\\" . $namespace . "\\" . $class; } //Consigo los parametros del constructor $params = array(); if (isset($dependencyDefinition['constructor'])) { //Parseo los parametros correctamente $params = $this->parseProperties($dependencyDefinition['constructor']); } //Creo una instancia con el constructor correspondiente en base a los parametros $reflection = new \ReflectionClass($class); $newInstance = $reflection->newInstanceArgs($params); //La agrego a loadedDependencies para dependencias circulares $loadedDependencies[$name] = $newInstance; //Si es un singleton la guardo como tal if (isset($dependencyDefinition['singleton']) && ($dependencyDefinition['singleton'] == "TRUE" || $dependencyDefinition['singleton'] == "true")) { $this->singletons[$name] = $newInstance; } //Injecto las dependencias a las propiedades //Primero veo si hay Referencia a otras dependencias y cargo las mismas y luego guardo las propiedades if (isset($dependencyDefinition['properties'])) { $properties = $this->parseProperties($dependencyDefinition['properties'], $loadedDependencies); $reflection = new Reflection($newInstance); $reflection->setProperties($properties, TRUE); } } return $newInstance; }