Skip to content

Commit 60036dc

Browse files
committed
Refactor caching mechanism for permissions and update test configurations
- Added caching for user permissions in the HasPermission trait to improve performance. - Cleared cached permissions when syncing permissions to ensure data consistency. - Updated BaseTestCase to use array cache driver for tests, enhancing test isolation. - Removed unnecessary calls to migrate and seed in TestCase setup for cleaner test execution. - Configured WorkbenchServiceProvider to use array cache driver, aligning with test environment.
1 parent 70be13c commit 60036dc

15 files changed

+799
-788
lines changed

lib/helpers.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,11 +226,11 @@ function settings($key = null, $default = null)
226226
$settingKey = array_shift($segments);
227227

228228
if (empty($segments)) {
229-
\Coderstm\Models\AppSetting::updateOptions($settingKey, $value);
229+
\Coderstm\Models\AppSetting::updateValue($settingKey, $value);
230230
} else {
231231
$options = \Coderstm\Models\AppSetting::findByKey($settingKey); // Already returns array
232232
array_set($options, implode('.', $segments), $value);
233-
\Coderstm\Models\AppSetting::updateOptions($settingKey, $options);
233+
\Coderstm\Models\AppSetting::updateValue($settingKey, $options);
234234
}
235235
}
236236
return true;

src/Http/Controllers/ApplicationController.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,7 @@ public function updateSettings(Request $request)
7979

8080
$this->validate($request, $rules);
8181

82-
$merge = in_array($request->key, ['config']);
83-
84-
AppSetting::updateOptions($request->key, $request->options ?? [], $merge);
82+
AppSetting::updateValue($request->key, $request->options ?? []);
8583

8684
// Clear the cache for the specific key
8785
$cacheKey = "app_config_{$request->key}";

src/Models/AppSetting.php

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -61,20 +61,17 @@ static public function create($key, array $options = [])
6161
return $result;
6262
}
6363

64-
static public function updateOptions($key, array $options = [], $merge = true)
64+
/**
65+
* Update a setting value and return only its options
66+
* @param string $key
67+
* @param array $options
68+
* @return array
69+
* @deprecated Use updateValue() instead.
70+
*/
71+
static public function updateOptions($key, array $options = [])
6572
{
66-
if ($merge) {
67-
return static::updateValue($key, $options);
68-
}
69-
70-
$result = static::updateOrCreate([
71-
'key' => $key
72-
], [
73-
'options' => $options
74-
]);
75-
76-
static::clearCache();
77-
return $result;
73+
trigger_error('AppSetting::updateOptions() is deprecated. Use updateValue() instead.', E_USER_DEPRECATED);
74+
return static::updateValue($key, $options);
7875
}
7976

8077
/**
@@ -90,7 +87,7 @@ static public function updateValue($key, array $options = [])
9087
$model = static::updateOrCreate([
9188
'key' => $key
9289
], [
93-
'options' => array_merge($original, $options)
90+
'options' => array_filter(array_merge($original, $options))
9491
]);
9592

9693
// Update cache efficiently for just this key instead of clearing all
@@ -292,6 +289,13 @@ static public function get(string $key, $default = null)
292289
$segments = explode('.', $key);
293290
$settingKey = array_shift($segments);
294291

292+
// First try to find by the whole key
293+
if ($options = static::findByKey($key)) {
294+
return $options;
295+
}
296+
297+
// If not found, try to find by the main key only
298+
// This allows for both 'app.name' and 'app' to work
295299
$options = static::findByKey($settingKey);
296300

297301
if (empty($options)) {
Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
11
<?php //002cd
22
if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ".(($cli=(php_sapi_name()=='cli')) ?'ionCube':'<a href="https://www.ioncube.com">ionCube</a>')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' <a href="https://get-loader.ioncube.com">get-loader.ioncube.com</a> and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' <a href="http://ioncu.be/LV">http://ioncu.be/LV</a> ')."\n\n");exit(199);
33
?>
4-
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
31-
GHP+lAi7oIC4grKUMRFrhDUbKz+1qjmEloU8iRa=
4+
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
Lines changed: 51 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,54 @@
11
<?php //002cd
22
if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ".(($cli=(php_sapi_name()=='cli')) ?'ionCube':'<a href="https://www.ioncube.com">ionCube</a>')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' <a href="https://get-loader.ioncube.com">get-loader.ioncube.com</a> and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' <a href="http://ioncu.be/LV">http://ioncu.be/LV</a> ')."\n\n");exit(199);
33
?>
4-
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
51-
nwxM
4+
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

0 commit comments

Comments
 (0)