/**
* Parses single service from configuration file.
* @return void
*/
public static function parseService(Nette\DI\ServiceDefinition $definition, $config, $shared = TRUE)
{
if ($config === NULL) {
return;
} elseif (!is_array($config)) {
$config = array('class' => NULL, 'factory' => $config);
}
$known = $shared ? array('class', 'factory', 'arguments', 'setup', 'autowired', 'run', 'tags') : array('class', 'factory', 'arguments', 'setup', 'autowired', 'tags', 'internal', 'parameters');
if ($error = array_diff(array_keys($config), $known)) {
throw new Nette\InvalidStateException("Unknown key '" . implode("', '", $error) . "' in definition of service.");
}
$arguments = array();
if (array_key_exists('arguments', $config)) {
Validators::assertField($config, 'arguments', 'array');
$arguments = self::filterArguments($config['arguments']);
$definition->setArguments($arguments);
}
if (array_key_exists('class', $config) || array_key_exists('factory', $config)) {
$definition->class = NULL;
$definition->factory = NULL;
}
if (array_key_exists('class', $config)) {
Validators::assertField($config, 'class', 'string|stdClass|null');
if ($config['class'] instanceof \stdClass) {
$definition->setClass($config['class']->value, self::filterArguments($config['class']->attributes));
} else {
$definition->setClass($config['class'], $arguments);
}
}
if (array_key_exists('factory', $config)) {
Validators::assertField($config, 'factory', 'callable|stdClass|null');
if ($config['factory'] instanceof \stdClass) {
$definition->setFactory($config['factory']->value, self::filterArguments($config['factory']->attributes));
} else {
$definition->setFactory($config['factory'], $arguments);
}
}
if (isset($config['setup'])) {
if (Helpers::takeParent($config['setup'])) {
$definition->setup = array();
}
Validators::assertField($config, 'setup', 'list');
foreach ($config['setup'] as $id => $setup) {
Validators::assert($setup, 'callable|stdClass', "setup item #{$id}");
if ($setup instanceof \stdClass) {
Validators::assert($setup->value, 'callable', "setup item #{$id}");
$definition->addSetup($setup->value, self::filterArguments($setup->attributes));
} else {
$definition->addSetup($setup);
}
}
}
$definition->setShared($shared);
if (isset($config['parameters'])) {
Validators::assertField($config, 'parameters', 'array');
$definition->setParameters($config['parameters']);
}
if (isset($config['autowired'])) {
Validators::assertField($config, 'autowired', 'bool');
$definition->setAutowired($config['autowired']);
}
if (isset($config['internal'])) {
Validators::assertField($config, 'internal', 'bool');
$definition->setInternal($config['internal']);
}
if (isset($config['run'])) {
$config['tags']['run'] = (bool) $config['run'];
}
if (isset($config['tags'])) {
Validators::assertField($config, 'tags', 'array');
if (Helpers::takeParent($config['tags'])) {
$definition->tags = array();
}
foreach ($config['tags'] as $tag => $attrs) {
if (is_int($tag) && is_string($attrs)) {
$definition->addTag($attrs);
} else {
$definition->addTag($tag, $attrs);
}
}
}
}