ManaPHP\Di::get PHP Метод

get() публичный Метод

Resolves the service based on its configuration
public get ( string $_name, array $parameters = [] ) : mixed
$_name string
$parameters array
Результат mixed
    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;
    }

Usage Example

Пример #1
0
 /**
  * Magic method __get
  *
  * @param string $name
  *
  * @return mixed
  * @throws \ManaPHP\Component\Exception
  */
 public function __get($name)
 {
     if ($this->_dependencyInjector === null) {
         $this->_dependencyInjector = Di::getDefault();
     }
     if ($name === 'persistent') {
         $getParameter = [get_class($this), $this->_dependencyInjector];
         $this->{'persistent'} = $this->_dependencyInjector->get('sessionBag', $getParameter);
     } else {
         $this->{$name} = $this->_dependencyInjector->{$name};
         if ($this->{$name} === null) {
             trigger_error('Access to undefined property `' . $name . '` of `' . get_called_class() . '`.');
         }
     }
     return $this->{$name};
 }