Nette\DI\Compiler::loadDefinitions PHP Метод

loadDefinitions() публичный статический Метод

Adds service definitions from configuration.
public static loadDefinitions ( ContainerBuilder $builder, array $services, $namespace = NULL ) : void
$builder ContainerBuilder
$services array
Результат void
    public static function loadDefinitions(ContainerBuilder $builder, array $services, $namespace = NULL)
    {
        $depths = [];
        foreach ($services as $name => $def) {
            $path = [];
            while (Config\Helpers::isInheriting($def)) {
                $path[] = $def;
                $def = isset($services[$def[Config\Helpers::EXTENDS_KEY]]) ? $services[$def[Config\Helpers::EXTENDS_KEY]] : [];
                if (in_array($def, $path, TRUE)) {
                    throw new ServiceCreationException("Circular reference detected for service '{$name}'.");
                }
            }
            $depths[$name] = count($path);
        }
        array_multisort($depths, $services);
        foreach ($services as $name => $def) {
            if ((string) (int) $name === (string) $name) {
                $postfix = $def instanceof Statement && is_string($def->getEntity()) ? '.' . $def->getEntity() : (is_scalar($def) ? ".{$def}" : '');
                $name = count($builder->getDefinitions()) + 1 . preg_replace('#\\W+#', '_', $postfix);
            } elseif ($namespace) {
                $name = $namespace . '.' . $name;
            }
            if ($def === FALSE) {
                $builder->removeDefinition($name);
                continue;
            }
            if ($namespace) {
                $def = Helpers::prefixServiceName($def, $namespace);
            }
            $params = $builder->parameters;
            if (is_array($def) && isset($def['parameters'])) {
                foreach ((array) $def['parameters'] as $k => $v) {
                    $v = explode(' ', is_int($k) ? $v : $k);
                    $params[end($v)] = $builder::literal('$' . end($v));
                }
            }
            $def = Helpers::expand($def, $params);
            if (($parent = Config\Helpers::takeParent($def)) && $parent !== $name) {
                trigger_error("Section inheritance {$name} < {$parent} is deprecated.", E_USER_DEPRECATED);
                $builder->removeDefinition($name);
                $definition = $builder->addDefinition($name, $parent === Config\Helpers::OVERWRITE ? NULL : clone $builder->getDefinition($parent));
            } elseif ($builder->hasDefinition($name)) {
                $definition = $builder->getDefinition($name);
            } else {
                $definition = $builder->addDefinition($name);
            }
            try {
                static::loadDefinition($definition, $def);
            } catch (\Exception $e) {
                throw new ServiceCreationException("Service '{$name}': " . $e->getMessage(), 0, $e);
            }
        }
    }

Usage Example

Пример #1
0
 public function loadConfiguration()
 {
     Compiler::loadDefinitions($this->getContainerBuilder(), $this->loadFromFile(__DIR__ . '/services.neon')['services']);
 }