static function parseService(Nette\DI\ServiceDefinition $definition, $config, $shared = TRUE) { if (!is_array($config)) { $config = array('class' => $config); } $known = $shared ? array('class', 'factory', 'arguments', 'setup', 'autowired', 'run', 'tags') : array('class', 'factory', 'arguments', 'setup', 'autowired', '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 (isset($config['arguments'])) { Validators::assertField($config, 'arguments', 'array'); $arguments = self::filterArguments($config['arguments']); } if (isset($config['class'])) { Validators::assertField($config, 'class', 'string|stdClass'); if ($config['class'] instanceof \stdClass) { $definition->setClass($config['class']->value, self::filterArguments($config['class']->attributes)); } else { $definition->setClass($config['class'], $arguments); } } if (isset($config['factory'])) { Validators::assertField($config, 'factory', 'callable|stdClass'); 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 (Config::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}"); if (strpos(is_array($setup->value) ? implode('', $setup->value) : $setup->value, '$') === FALSE) { $definition->addSetup($setup->value, self::filterArguments($setup->attributes)); } else { Validators::assert($setup->attributes, 'list:1', "setup arguments for '{$setup->value}'"); $definition->addSetup($setup->value, $setup->attributes[0]); } } 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|string'); $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 (Config::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); } } } }
function dump(array $data) { $tmp = array(); foreach ($data as $name => $secData) { if ($parent = Config::takeParent($secData)) { $name .= ' ' . self::INHERITING_SEPARATOR . ' ' . $parent; } $tmp[$name] = $secData; } return "# generated by Nette\n\n" . Neon::encode($tmp, Neon::BLOCK); }