+ $value = $this->getValueFromStore($key, $default);
+ return $this->formatValue($value, $default);
+ }
+
+ /**
+ * Gets a setting value from the cache or database.
+ * Looks at the system defaults if not cached or in database.
+ * @param $key
+ * @param $default
+ * @return mixed
+ */
+ protected function getValueFromStore($key, $default)
+ {
+ // Check for an overriding value
+ $overrideValue = $this->getOverrideValue($key);
+ if ($overrideValue !== null) return $overrideValue;
+
+ // Check the cache
+ $cacheKey = $this->cachePrefix . $key;
+ if ($this->cache->has($cacheKey)) {
+ return $this->cache->get($cacheKey);
+ }
+
+ // Check the database
+ $settingObject = $this->getSettingObjectByKey($key);
+ if ($settingObject !== null) {
+ $value = $settingObject->value;
+ $this->cache->forever($cacheKey, $value);
+ return $value;
+ }
+
+ // Check the defaults set in the app config.
+ $configPrefix = 'setting-defaults.' . $key;
+ if (config()->has($configPrefix)) {
+ $value = config($configPrefix);
+ $this->cache->forever($cacheKey, $value);
+ return $value;
+ }
+
+ return $default;
+ }
+
+ /**
+ * Clear an item from the cache completely.
+ * @param $key
+ */
+ protected function clearFromCache($key)
+ {
+ $cacheKey = $this->cachePrefix . $key;
+ $this->cache->forget($cacheKey);
+ }
+
+ /**
+ * Format a settings value
+ * @param $value
+ * @param $default
+ * @return mixed
+ */
+ protected function formatValue($value, $default)
+ {
+ // Change string booleans to actual booleans
+ if ($value === 'true') $value = true;
+ if ($value === 'false') $value = false;
+
+ // Set to default if empty
+ if ($value === '') $value = $default;
+ return $value;