lukasss93/laravel-model-settings
Add per-model settings to Eloquent with defaults, validation rules, and optional config publishing. Store and retrieve settings directly on your models, initialize settings on creation, and keep your app flexible with PHP 8+ and Laravel 8+ support.
Install the package:
composer require lukasss93/laravel-model-settings
Choose a storage method and apply the appropriate trait to your model:
php artisan model-settings:model-settings-field User
Add to your model:
use Lukasss93\ModelSettings\Traits\HasSettingsField;
class User extends Model { use HasSettingsField; }
php artisan model-settings:model-settings-table User
Add to your model:
use Lukasss93\ModelSettings\Traits\HasSettingsTable;
class User extends Model { use HasSettingsTable; }
use Lukasss93\ModelSettings\Traits\HasSettingsRedis;
class User extends Model { use HasSettingsRedis; }
First use case: Set and retrieve a setting:
$user = User::first();
$user->settings()->set('theme', 'dark'); // Set
$theme = $user->settings()->get('theme'); // Retrieve
.env (MODEL_SETTINGS_FIELD_NAME or MODEL_SETTINGS_TABLE_NAME).$persistSettings (default: true).$user->settings()->set('key', 'value');
$value = $user->settings()->get('key', 'default');
$user->settings()->delete('key');
$user->settings()->setMultiple(['key1' => 'val1', 'key2' => 'val2']);
$values = $user->settings()->getMultiple(['key1', 'key2'], 'default');
$user->settings()->deleteMultiple(['key1', 'key2']);
$user->settings()->clear();
Define defaults and rules in your model:
public function defaultSettings(): array {
return ['theme' => 'light', 'notifications' => true];
}
public function settingsRules(): array {
return [
'theme' => 'in:light,dark',
'notifications' => 'boolean',
];
}
$initSettings = true.Override the settings() method alias:
public $invokeSettingsBy = 'configurations';
// Now use: $user->configurations()->get('key')
if ($user->settings()->has('theme')) {
// Setting exists
}
if ($user->settings()->empty()) {
// No settings exist
}
settings.stored or settings.retrieved via Laravel events.$user->settings()->shouldReceive('get')->andReturn('mocked_value');
Migration Order:
model-settings:model-settings-field/table before migrating the model table.HasSettingsField.Validation Timing:
settingsRules() are applied only during set(), apply(), or update().get() bypasses validation.Default Initialization:
$initSettings = true applies defaults only once (on first save if using field-based storage).defaultSettings() to reset defaults dynamically.Redis Cache Invalidation:
settings()->flush() to force sync.Nested Arrays:
['user' => ['name' => 'John']] becomes 'user.name').get('user.name').$user->settings()->getStorage(); // Returns 'field', 'table', or 'redis'
php artisan db:show User settings
$user->settings()->flush();
Custom Storage:
Implement Lukasss93\ModelSettings\Contracts\SettingsStorage for alternative backends (e.g., DynamoDB).
Event Hooks: Publish the config and extend:
ModelSettings::extend(function ($model) {
$model->settings()->listen('stored', fn() => Log::info('Setting saved'));
});
Dynamic Rules:
Use closures in settingsRules() for runtime validation:
'max_posts' => function ($value, $attribute) {
return $value <= auth()->user()->plan->limit;
}
Fallback Logic:
Chain defaults in get():
$value = $user->settings()->get('theme', 'light', 'dark');
MODEL_SETTINGS_PERSISTENT: Overrides $persistSettings globally.MODEL_SETTINGS_CACHE_MINUTES: Adjusts Redis/table cache TTL (default: 60).php artisan vendor:publish --tag="model-settings-config"
Customize settings_field_name, settings_table_name, and storage (e.g., redis).settings()->apply() with queued jobs for async updates:
User::find($id)->settings()->apply($settings)->save();
How can I help you explore Laravel packages today?