reader = $reader; $this->overrideData = $overrideData; } /** * Gets data from flattened data * * @param string $key * @param mixed $defaultValue * @return mixed|null */ public function get($key = null, $defaultValue = null) { $this->load(); if ($key === null) { return $this->flatData; } return isset($this->flatData[$key]) ? $this->flatData[$key] : $defaultValue; } /** * Checks if data available * * @return bool */ public function isAvailable() { $this->data = null; $this->load(); return isset($this->flatData[ConfigOptionsListConstants::CONFIG_PATH_INSTALL_DATE]); } /** * Gets a value specified key from config data * * @param string $key * @return null|mixed */ public function getConfigData($key = null) { $this->load(); if ($key !== null && !isset($this->data[$key])) { return null; } if (isset($this->data[$key])) { return $this->data[$key]; } return $this->data; } /** * Resets config data * * @return void */ public function resetData() { $this->data = null; } /** * Loads the configuration data * * @return void */ private function load() { if (null === $this->data) { $this->data = $this->reader->load(); if ($this->overrideData) { $this->data = array_replace($this->data, $this->overrideData); } // flatten data for config retrieval using get() $this->flatData = $this->flattenParams($this->data); } } /** * Convert associative array of arbitrary depth to a flat associative array with concatenated key path as keys * each level of array is accessible by path key * * @param array $params * @param string $path * @return array * @throws \Exception */ private function flattenParams(array $params, $path = null) { $cache = []; foreach ($params as $key => $param) { if ($path) { $newPath = $path . '/' . $key; } else { $newPath = $key; } if (isset($cache[$newPath])) { throw new \Exception("Key collision {$newPath} is already defined."); } $cache[$newPath] = $param; if (is_array($param)) { $cache = array_merge($cache, $this->flattenParams($param, $newPath)); } } return $cache; } }