public function get($_name, $parameters = [])
{
$name = !isset($this->_services[$_name]) && isset($this->_aliases[$_name]) ? $this->_aliases[$_name] : $_name;
if (isset($this->_services[$name])) {
$service = $this->_services[$name];
if (is_string($service)) {
$definition = $service;
$shared = true;
} elseif (isset($service['class'])) {
$definition = $service['class'];
if (isset($service['parameters'])) {
$parameters = $service['parameters'];
}
$shared = isset($service['shared']) ? $service['shared'] : true;
} else {
$parts = $this->_services[$name];
$definition = $parts[0];
/** @noinspection MultiAssignmentUsageInspection */
$shared = $parts[1];
}
} else {
$definition = $name;
$shared = false;
}
if (isset($this->_sharedInstances[$name])) {
return $this->_sharedInstances[$name];
}
// if (isset($this->eventsManager)) {
// $this->eventsManager->fireEvent('di:beforeResolve', $this, ['name' => $_name, 'parameters' => $parameters]);
// }
if (is_string($definition)) {
if (!class_exists($definition)) {
/** @noinspection ExceptionsAnnotatingAndHandlingInspection */
throw new DiException('`:name` service cannot be resolved: `:class` class is not exists', ['name' => $_name, 'class' => $definition]);
}
$count = count($parameters);
if ($count === 0) {
$instance = new $definition();
} elseif ($count === 1) {
$instance = new $definition($parameters[0]);
} elseif ($count === 2) {
$instance = new $definition($parameters[0], $parameters[1]);
} elseif ($count === 3) {
$instance = new $definition($parameters[0], $parameters[1], $parameters[2]);
} else {
$reflection = new \ReflectionClass($definition);
$instance = $reflection->newInstanceArgs($parameters);
}
} elseif ($definition instanceof \Closure) {
$instance = call_user_func_array($definition, $parameters);
} elseif (is_object($definition)) {
$instance = $definition;
} else {
/** @noinspection ExceptionsAnnotatingAndHandlingInspection */
throw new DiException('`:name` service cannot be resolved: service implement type is not supported', ['name' => $_name]);
}
if ($shared) {
$this->_sharedInstances[$name] = $instance;
}
if ($instance instanceof Component) {
$instance->setDependencyInjector($this);
}
// if (isset($this->eventsManager)) {
// $this->eventsManager->fireEvent('di:afterResolve', $this, ['name' => $_name, 'parameters' => $parameters, 'instance' => $instance]);
// }
return $instance;
}