anlutro / anlutro/laravel-settings
Add support for NULL setting value to DatabaseSettingStore
- Ngôn ngữ chính
- PHP
- Star
- 930
- Fork
- 113
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Mô tả
Hello,
Recently i've encountered a problem with storing `null` as a setting value: a new non-null value isnt stored into database if such a key already exists and have a `null` value.
```php
// This will create a new setting with nullable value
settings()->set([
'key' => null,
]);
settings()->save();
// That new value will not be stored into database, the actual value will remain "null"
settings()->set([
'key' => 'value',
]);
settings()->save();
```
The cause of this problem is that `DatabaseSettingStore` uses the `isset()` function to determine if a specific key exists, but that function does not consider `null` values. I would suggest to use the `array_key_exists()` function instead:
```php
class DatabaseSettingStore extends SettingStore
{
protected function write(array $data): void {
// ...
foreach ($keys as $key) {
if (
array_key_exists($key, $updatedData)
&& array_key_exists($key, $persistedData)
&& (string) $updatedData[$key] !== (string) $persistedData[$key]
) {
$updateData[$key] = $updatedData[$key];
} elseif (!array_key_exists($key, $insertData)) {
$deleteKeys[] = $key;
}
unset($insertData[$key]);
}
// ...
}
}
```
A use-case for this improvement is that sometimes (my case :)) you have a single form for the project settings and some of them may not have a value (`null` by default) and it is handy to just save all validated settings into database, event if some values are `null`:
```php
$settings = $request->validated();
settings()->set($settings);
settings()->save();
```
Hướng dẫn đóng góp
Đánh giá
Issue này chưa được đánh giá.