readerFactory = $readerFactory; $this->cache = $cache; $this->serializer = $serializer; $this->argumentInterpreter = $argumentInterpreter; $this->cacheId = static::CACHE_ID; $this->initData(); } /** * Initialise data for configuration * * @return void */ private function initData() { $data = $this->cache->load($this->cacheId); if (false === $data) { /** @var Definition $reader */ $reader = $this->readerFactory->create(); $data = $reader->read(); $this->cache->save($this->serializer->serialize($data), $this->cacheId); } else { $data = $this->serializer->unserialize($data); } if (!empty($data)) { $this->data = $this->evaluateComponentArguments($data); } } /** * Merge config data to the object * * @param array $config * @return void */ public function merge(array $config) { $this->data = array_replace_recursive($this->data, $config); } /** * Get config value by key * * @param string $key * @param mixed $default * @return array|mixed|null */ public function get($key, $default = null) { return isset($this->data[$key]) ? $this->data[$key] : $default; } /** * Evaluated components data * * @param array $components * @return array */ private function evaluateComponentArguments($components) { foreach ($components as &$component) { $component[Converter::DATA_ATTRIBUTES_KEY] = isset($component[Converter::DATA_ATTRIBUTES_KEY]) ? $component[Converter::DATA_ATTRIBUTES_KEY] : []; $component[Converter::DATA_ARGUMENTS_KEY] = isset($component[Converter::DATA_ARGUMENTS_KEY]) ? $component[Converter::DATA_ARGUMENTS_KEY] : []; foreach ($component[Converter::DATA_ARGUMENTS_KEY] as $argumentName => $argument) { $component[Converter::DATA_ARGUMENTS_KEY][$argumentName] = $this->argumentInterpreter->evaluate($argument); } } return $components; } }