/**
* Adds service definitions from configuration.
* @return 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);
}
}
}