/** * Parses section 'services' from configuration file. * @return void */ public static function parseServices(Nette\DI\ContainerBuilder $container, array $config, $namespace = NULL) { $services = isset($config['services']) ? $config['services'] : array(); $factories = isset($config['factories']) ? $config['factories'] : array(); $all = array_merge($services, $factories); uasort($all, function ($a, $b) { return strcmp(Helpers::isInheriting($a), Helpers::isInheriting($b)); }); foreach ($all as $origName => $def) { $shared = array_key_exists($origName, $services); if ((string) (int) $origName === (string) $origName) { $name = (string) (count($container->getDefinitions()) + 1); } elseif ($shared && array_key_exists($origName, $factories)) { throw new Nette\DI\ServiceCreationException("It is not allowed to use services and factories with the same name: '{$origName}'."); } else { $name = ($namespace ? $namespace . '.' : '') . strtr($origName, '\\', '_'); } if (($parent = Helpers::takeParent($def)) && $parent !== $name) { $container->removeDefinition($name); $definition = $container->addDefinition($name); if ($parent !== Helpers::OVERWRITE) { foreach ($container->getDefinition($parent) as $k => $v) { $definition->{$k} = unserialize(serialize($v)); // deep clone } } } elseif ($container->hasDefinition($name)) { $definition = $container->getDefinition($name); if ($definition->shared !== $shared) { throw new Nette\DI\ServiceCreationException("It is not allowed to use service and factory with the same name '{$name}'."); } } else { $definition = $container->addDefinition($name); } try { static::parseService($definition, $def, $shared); } catch (\Exception $e) { throw new Nette\DI\ServiceCreationException("Service '{$name}': " . $e->getMessage(), NULL, $e); } } }
/** * Parses section 'services' from configuration file. * * @return void */ public static function parseServices(Nette\DI\ContainerBuilder $container, array $config, $namespace = null) { $services = isset($config['services']) ? $config['services'] : array(); $factories = isset($config['factories']) ? $config['factories'] : array(); if ($tmp = array_intersect_key($services, $factories)) { $tmp = implode("', '", array_keys($tmp)); throw new Nette\DI\ServiceCreationException("It is not allowed to use services and factories with the same names: '{$tmp}'."); } $all = $services + $factories; uasort($all, function ($a, $b) { return strcmp(Helpers::isInheriting($a), Helpers::isInheriting($b)); }); foreach ($all as $name => $def) { $shared = array_key_exists($name, $services); $name = ($namespace ? $namespace . '.' : '') . $name; if (($parent = Helpers::takeParent($def)) && $parent !== $name) { $container->removeDefinition($name); $definition = $container->addDefinition($name); if ($parent !== Helpers::OVERWRITE) { foreach ($container->getDefinition($parent) as $k => $v) { $definition->{$k} = unserialize(serialize($v)); // deep clone } } } elseif ($container->hasDefinition($name)) { $definition = $container->getDefinition($name); if ($definition->shared !== $shared) { throw new Nette\DI\ServiceCreationException("It is not allowed to use service and factory with the same name '{$name}'."); } } else { $definition = $container->addDefinition($name); } try { static::parseService($definition, $def, $shared); } catch (\Exception $e) { throw new Nette\DI\ServiceCreationException("Service '{$name}': " . $e->getMessage(), null, $e); } } }