/** * 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; }
/** * Reads configuration from INI file. * @param string file name * @return array * @throws InvalidStateException */ public function load($file) { set_error_handler(create_function('$severity, $message', ' // parse_ini_file returns FALSE on failure since PHP 5.2.7 restore_error_handler(); throw new InvalidStateException("parse_ini_file(): $message"); ')); $ini = parse_ini_file($file, TRUE); restore_error_handler(); $data = array(); foreach ($ini as $secName => $secData) { if (is_array($secData)) { // is section? if (substr($secName, -1) === self::RAW_SECTION) { $secName = substr($secName, 0, -1); } else { // process key nesting separator (key1.key2.key3) $tmp = array(); foreach ($secData as $key => $val) { $cursor = & $tmp; $key = str_replace(self::ESCAPED_KEY_SEPARATOR, "\xFF", $key); foreach (explode(self::KEY_SEPARATOR, $key) as $part) { $part = str_replace("\xFF", self::KEY_SEPARATOR, $part); if (!isset($cursor[$part]) || is_array($cursor[$part])) { $cursor = & $cursor[$part]; } else { throw new InvalidStateException("Invalid key '$key' in section [$secName] in file '$file'."); } } $cursor = $val; } $secData = $tmp; } $parts = explode(self::INHERITING_SEPARATOR, $secName); if (count($parts) > 1) { $secName = trim($parts[0]); $secData[NConfigHelpers::EXTENDS_KEY] = trim($parts[1]); } } $cursor = & $data; // nesting separator in section name foreach (explode(self::KEY_SEPARATOR, $secName) as $part) { if (!isset($cursor[$part]) || is_array($cursor[$part])) { $cursor = & $cursor[$part]; } else { throw new InvalidStateException("Invalid section [$secName] in file '$file'."); } } if (is_array($secData) && is_array($cursor)) { $secData = NConfigHelpers::merge($secData, $cursor); } $cursor = $secData; } return $data; }
/** * Reads configuration from INI file. * @param string file name * @return array * @throws InvalidStateException */ public function load($file) { NDebugger::tryError(); $ini = parse_ini_file($file, TRUE); if (NDebugger::catchError($e)) { throw new InvalidStateException('parse_ini_file(): ' . $e->getMessage(), 0, $e); } $data = array(); foreach ($ini as $secName => $secData) { if (is_array($secData)) { // is section? if (substr($secName, -1) === self::RAW_SECTION) { $secName = substr($secName, 0, -1); } else { // process key nesting separator (key1.key2.key3) $tmp = array(); foreach ($secData as $key => $val) { $cursor = & $tmp; $key = str_replace(self::ESCAPED_KEY_SEPARATOR, "\xFF", $key); foreach (explode(self::KEY_SEPARATOR, $key) as $part) { $part = str_replace("\xFF", self::KEY_SEPARATOR, $part); if (!isset($cursor[$part]) || is_array($cursor[$part])) { $cursor = & $cursor[$part]; } else { throw new InvalidStateException("Invalid key '$key' in section [$secName] in file '$file'."); } } $cursor = $val; } $secData = $tmp; } $parts = explode(self::INHERITING_SEPARATOR, $secName); if (count($parts) > 1) { $secName = trim($parts[0]); $secData[NConfigHelpers::EXTENDS_KEY] = trim($parts[1]); } } $cursor = & $data; // nesting separator in section name foreach (explode(self::KEY_SEPARATOR, $secName) as $part) { if (!isset($cursor[$part]) || is_array($cursor[$part])) { $cursor = & $cursor[$part]; } else { throw new InvalidStateException("Invalid section [$secName] in file '$file'."); } } if (is_array($secData) && is_array($cursor)) { $secData = NConfigHelpers::merge($secData, $cursor); } $cursor = $secData; } return $data; }
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; }
/** * 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; }