anlutro / anlutro/laravel-settings
Add support for NULL setting value to DatabaseSettingStore
- Lenguaje dominante
- PHP
- Estrellas
- 930
- Forks
- 113
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Descripción
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();
```
Guía de contribución
Evaluación
Este issue todavía no se ha evaluado.