/** * Gets the service object of the specified type. * @param string service name * @param array options in case service is not singleton * @return mixed */ public function getService($name, array $options = NULL) { if (!is_string($name) || $name === '') { throw new InvalidArgumentException("Service name must be a non-empty string, " . gettype($name) . " given."); } $lower = strtolower($name); if (isset($this->registry[$lower])) { // instantiated singleton if ($options) { throw new InvalidArgumentException("Service named '{$name}' is singleton and therefore can not have options."); } return $this->registry[$lower]; } elseif (isset($this->factories[$lower])) { list($factory, $singleton, $defOptions) = $this->factories[$lower]; if ($singleton && $options) { throw new InvalidArgumentException("Service named '{$name}' is singleton and therefore can not have options."); } elseif ($defOptions) { $options = $options ? $options + $defOptions : $defOptions; } if (is_string($factory) && strpos($factory, ':') === FALSE) { // class name /**/ fixNamespace($factory); /**/ if (!class_exists($factory)) { throw new AmbiguousServiceException("Cannot instantiate service '{$name}', class '{$factory}' not found."); } $service = new $factory(); if ($options && method_exists($service, 'setOptions')) { $service->setOptions($options); // TODO: better! } } else { // factory callback /**/ fixCallback($factory); /**/ if (!is_callable($factory)) { $able = is_callable($factory, TRUE, $textual); throw new AmbiguousServiceException("Cannot instantiate service '{$name}', handler '{$textual}' is not " . ($able ? 'callable.' : 'valid PHP callback.')); } $service = call_user_func($factory, $options); if (!is_object($service)) { $able = is_callable($factory, TRUE, $textual); throw new AmbiguousServiceException("Cannot instantiate service '{$name}', value returned by '{$textual}' is not object."); } } if ($singleton) { $this->registry[$lower] = $service; unset($this->factories[$lower]); } return $service; } if ($this->parent !== NULL) { return $this->parent->getService($name, $options); } else { throw new InvalidStateException("Service '{$name}' not found."); } }
/** * Gets the service object of the specified type. * @param string service name * @param bool throw exception if service doesn't exist? * @return mixed */ public function getService($name, $need = TRUE) { if (!is_string($name) || $name === '') { throw new InvalidArgumentException("Service name must be a non-empty string, " . gettype($name) . " given."); } $lower = strtolower($name); if (isset($this->registry[$lower])) { return $this->registry[$lower]; } elseif (isset($this->factories[$lower])) { $service = $this->factories[$lower]; if (is_string($service)) { if (substr($service, -2) === '()') { // trick to pass callback as string $service = substr($service, 0, -2); } else { fixNamespace($service); if (!class_exists($service)) { throw new AmbiguousServiceException("Cannot instantiate service '{$name}', class '{$service}' not found."); } return $this->registry[$lower] = new $service(); } } fixCallback($service); if (!is_callable($service)) { $able = is_callable($service, TRUE, $textual); throw new AmbiguousServiceException("Cannot instantiate service '{$name}', handler '{$textual}' is not " . ($able ? 'callable.' : 'valid PHP callback.')); } return $this->registry[$lower] = call_user_func($service); } if ($this->parent !== NULL) { return $this->parent->getService($name, $need); } elseif ($need) { throw new InvalidStateException("Service '{$name}' not found."); } else { return NULL; } }
/** * Gets the service object of the specified type. * @param string service name * @param bool throw exception if service doesn't exist? * @return mixed */ public function getService($name, $need = TRUE) { if (!is_string($name) || $name === '') { throw new InvalidArgumentException('Service name must be a non-empty string.'); } $lower = strtolower($name); if (isset($this->registry[$lower])) { return $this->registry[$lower]; } elseif (isset($this->factories[$lower])) { $service = $this->factories[$lower]; if (is_string($service)) { if (substr($service, -2) === '()') { // trick to pass callback as string $service = substr($service, 0, -2); } else { /**/ // fix for namespaced classes/interfaces in PHP < 5.3 if ($a = strrpos($service, '\\')) { $service = substr($service, $a + 1); } /**/ if (!class_exists($service)) { throw new AmbiguousServiceException("Cannot instantiate service, class '{$service}' not found."); } return $this->registry[$lower] = new $service(); } } return $this->registry[$lower] = call_user_func($service); } if ($this->parent !== NULL) { return $this->parent->getService($name); } elseif ($need) { throw new InvalidStateException("Service '{$name}' not found."); } else { return NULL; } }