X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/17f4aa4300976937a0e90df8328229436a3c3d4c..refs/pull/262/head:/app/Services/SettingService.php diff --git a/app/Services/SettingService.php b/app/Services/SettingService.php index 4c27035fd..bf5fa918e 100644 --- a/app/Services/SettingService.php +++ b/app/Services/SettingService.php @@ -1,26 +1,32 @@ -setting = $setting; + $this->cache = $cache; } /** @@ -32,8 +38,73 @@ class SettingService */ public function get($key, $default = false) { - $setting = $this->getSettingObjectByKey($key); - return $setting === null ? $default : $setting->value; + $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; } /** @@ -60,6 +131,7 @@ class SettingService ]); $setting->value = $value; $setting->save(); + $this->clearFromCache($key); return true; } @@ -71,9 +143,10 @@ class SettingService public function remove($key) { $setting = $this->getSettingObjectByKey($key); - if($setting) { + if ($setting) { $setting->delete(); } + $this->clearFromCache($key); return true; } @@ -82,8 +155,23 @@ class SettingService * @param $key * @return mixed */ - private function getSettingObjectByKey($key) { + protected function getSettingObjectByKey($key) + { return $this->setting->where('setting_key', '=', $key)->first(); } + + /** + * Returns an override value for a setting based on certain app conditions. + * Used where certain configuration options overrule others. + * Returns null if no override value is available. + * @param $key + * @return bool|null + */ + protected function getOverrideValue($key) + { + if ($key === 'registration-enabled' && config('auth.method') === 'ldap') return false; + return null; + } + } \ No newline at end of file