/** * Returns extension configuration. * @param array default values. * @param bool perform %parameters% expansion? * @return array */ public function getConfig(array $defaults = NULL, $expand = TRUE) { $config = $this->compiler->getConfig(); $config = isset($config[$this->name]) ? $config[$this->name] : array(); unset($config['services'], $config['factories']); $config = NConfigHelpers::merge($config, $defaults); return $expand ? $this->compiler->getContainerBuilder()->expand($config) : $config; }
/** * Generates configuration in NEON format. * @param array * @return string */ public function dump(array $data) { $tmp = array(); foreach ($data as $name => $secData) { if ($parent = NConfigHelpers::takeParent($secData)) { $name .= ' ' . self::INHERITING_SEPARATOR . ' ' . $parent; } $tmp[$name] = $secData; } return "# generated by Nette\n\n" . NNeon::encode($tmp, NNeon::BLOCK); }
private function getSection(array $data, $key, $file) { NValidators::assertField($data, $key, 'array|null', "section '%' in file '$file'"); $item = $data[$key]; if ($parent = NConfigHelpers::takeParent($item)) { $item = NConfigHelpers::merge($item, $this->getSection($data, $parent, $file)); } return $item; }
/** * Generates configuration in INI format. * @param array * @return string */ public function dump(array $data) { $output = array(); foreach ($data as $name => $secData) { if (!is_array($secData)) { $output = array(); self::build($data, $output, ''); break; } if ($parent = NConfigHelpers::takeParent($secData)) { $output[] = "[$name " . self::INHERITING_SEPARATOR . " $parent]"; } else { $output[] = "[$name]"; } self::build($secData, $output, ''); $output[] = ''; } return "; generated by Nette\n\n" . implode(PHP_EOL, $output); }
/** * Parses single service from configuration file. * @return void */ public static function parseService(NDIServiceDefinition $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 InvalidStateException("Unknown key '" . implode("', '", $error) . "' in definition of service."); } $arguments = array(); if (array_key_exists('arguments', $config)) { NValidators::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)) { NValidators::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)) { NValidators::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 (NConfigHelpers::takeParent($config['setup'])) { $definition->setup = array(); } NValidators::assertField($config, 'setup', 'list'); foreach ($config['setup'] as $id => $setup) { NValidators::assert($setup, 'callable|stdClass', "setup item #$id"); if ($setup instanceof stdClass) { NValidators::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'])) { NValidators::assertField($config, 'parameters', 'array'); $definition->setParameters($config['parameters']); } if (isset($config['autowired'])) { NValidators::assertField($config, 'autowired', 'bool'); $definition->setAutowired($config['autowired']); } if (isset($config['internal'])) { NValidators::assertField($config, 'internal', 'bool'); $definition->setInternal($config['internal']); } if (isset($config['run'])) { $config['tags']['run'] = (bool) $config['run']; } if (isset($config['tags'])) { NValidators::assertField($config, 'tags', 'array'); if (NConfigHelpers::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); } } } }
/** * Build system container class. * @return string */ protected function buildContainer(& $dependencies) { $loader = new NConfigLoader; $config = array(); $code = "<?php\n"; foreach ($this->files as $tmp) { list($file, $section) = $tmp; $config = NConfigHelpers::merge($loader->load($file, $section), $config); $code .= "// source: $file $section\n"; } $code .= "\n"; $this->checkCompatibility($config); if (!isset($config['parameters'])) { $config['parameters'] = array(); } $config['parameters'] = NConfigHelpers::merge($config['parameters'], $this->params); $compiler = $this->createCompiler(); $this->onCompile($this, $compiler); $code .= $compiler->compile( $config, $this->params['container']['class'], $config['parameters']['container']['parent'] ); $dependencies = array_merge($loader->getDependencies(), $compiler->getContainerBuilder()->getDependencies()); return $code; }