function PhpArrayContainer::createService

Same name and namespace in other branches
  1. 9 core/lib/Drupal/Component/DependencyInjection/PhpArrayContainer.php \Drupal\Component\DependencyInjection\PhpArrayContainer::createService()
  2. 8.9.x core/lib/Drupal/Component/DependencyInjection/PhpArrayContainer.php \Drupal\Component\DependencyInjection\PhpArrayContainer::createService()
  3. 10 core/lib/Drupal/Component/DependencyInjection/PhpArrayContainer.php \Drupal\Component\DependencyInjection\PhpArrayContainer::createService()

Overrides Container::createService

1 call to PhpArrayContainer::createService()
PhpArrayContainer::resolveServicesAndParameters in core/lib/Drupal/Component/DependencyInjection/PhpArrayContainer.php
Resolves arguments that represent services or variables to the real values.

File

core/lib/Drupal/Component/DependencyInjection/PhpArrayContainer.php, line 47

Class

PhpArrayContainer
Provides a container optimized for Drupal's needs.

Namespace

Drupal\Component\DependencyInjection

Code

protected function createService(array $definition, $id) {
    // This method is a verbatim copy of
    // \Drupal\Component\DependencyInjection\Container::createService
    // except for the following difference:
    // - There are no instanceof checks on \stdClass, which are used in the
    //   parent class to avoid resolving services and parameters when it is
    //   known from dumping that there is nothing to resolve.
    if (isset($definition['synthetic']) && $definition['synthetic'] === TRUE) {
        throw new RuntimeException(sprintf('You have requested a synthetic service ("%s"). The service container does not know how to construct this service. The service will need to be set before it is first used.', $id));
    }
    $arguments = [];
    if (isset($definition['arguments'])) {
        $arguments = $this->resolveServicesAndParameters($definition['arguments']);
    }
    if (isset($definition['file'])) {
        $file = $this->frozen ? $definition['file'] : current($this->resolveServicesAndParameters([
            $definition['file'],
        ]));
        require_once $file;
    }
    if (isset($definition['factory'])) {
        $factory = $definition['factory'];
        if (is_array($factory)) {
            $factory = $this->resolveServicesAndParameters([
                $factory[0],
                $factory[1],
            ]);
        }
        elseif (!is_string($factory)) {
            throw new RuntimeException(sprintf('Cannot create service "%s" because of invalid factory', $id));
        }
        $service = call_user_func_array($factory, $arguments);
    }
    else {
        $class = $this->frozen ? $definition['class'] : current($this->resolveServicesAndParameters([
            $definition['class'],
        ]));
        $service = new $class(...$arguments);
    }
    if (!isset($definition['shared']) || $definition['shared'] !== FALSE) {
        $this->services[$id] = $service;
    }
    if (isset($definition['calls'])) {
        foreach ($definition['calls'] as $call) {
            $method = $call[0];
            $arguments = [];
            if (!empty($call[1])) {
                $arguments = $call[1];
                $arguments = $this->resolveServicesAndParameters($arguments);
            }
            call_user_func_array([
                $service,
                $method,
            ], $arguments);
        }
    }
    if (isset($definition['properties'])) {
        $definition['properties'] = $this->resolveServicesAndParameters($definition['properties']);
        foreach ($definition['properties'] as $key => $value) {
            $service->{$key} = $value;
        }
    }
    if (isset($definition['configurator'])) {
        $callable = $definition['configurator'];
        if (is_array($callable)) {
            $callable = $this->resolveServicesAndParameters($callable);
        }
        if (!is_callable($callable)) {
            throw new InvalidArgumentException(sprintf('The configurator for class "%s" is not a callable.', get_class($service)));
        }
        call_user_func($callable, $service);
    }
    return $service;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.