anlutro / anlutro/laravel-settings

Add support for NULL setting value to DatabaseSettingStore

Đang mở
#171 1 bình luận 1 reaction 0 người được giao Xem trên GitHub
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

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.