laravel-model-settings-bag maintained by netkod-bilisim
Laravel Model Settings Bag
Introduction
You can add simple and flexible, single or multiple settings to your Laravel models.
Requirements
- PHP >= 7.4
Install
composer require netkod-bilisim/laravel-model-settings-bag:"^1"
Integration
Single Setting
1. Add a JSON settings field to your model's migration.
create_users_table.php
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->json('settings')->nullable();
$table->rememberToken();
$table->timestamps();
});
2. Use the trait NetkodBilisim\LaravelModelSettingsBag\ModelHasSettingsBag within your model.
User.php
use NetkodBilisim\LaravelModelSettingsBag\ModelHasSettingsBag;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use ModelHasSettingsBag;
// truncated for brevity..
}
Multiple
1. Add a JSON settings field to your model's migration.
create_user_template_settings_table.php
Schema::create('user_template_settings', function (Blueprint $table) {
$table->id();
$table->unsignedInteger('user_id');
$table->json('settings')->nullable();
$table->rememberToken();
$table->timestamps();
});
2. Use the trait NetkodBilisim\LaravelModelSettingsBag\ModelHasSettingsBag within your other setting model.
User TemplateSetting.php
use NetkodBilisim\LaravelModelSettingsBag\ModelHasSettingsBag;
use Illuminate\Database\Eloquent\Model;
class UserTemplateSetting extends Model
{
use ModelHasSettingsBag;
}
3. Use the trait NetkodBilisim\LaravelModelSettingsBag\ModelHasSettingsBag within your model.
User.php
class User extends Model
{
use ModelHasSettingsBag;
public function templateSettings()
{
return $this->hasOne(User TemplateSetting::class);
}
}
Usage
1.) Get all of the model's settings.
$user = App\User::first();
$user->settings()->all(); // Returns an array of the user's settings.
$user->settings('template')->get(); // Returns an array of a user's template settings.
2.) Get a specific setting.
$user = App\User::first();
$user->settings()->get('some.setting');
$user->settings()->get('some.setting', $defaultValue); // With a default value.
$user->settings('template')->get('layout.boxed');
$user->settings('template')->get('layout.boxed', $defaultValue); // With a default value.
3.) Add or update a setting.
$user = App\User::first();
$user->settings()->update('some.setting', 'new value');
$user->settings('template')->update('layout.boxed', 'new value');
4.) Determine if the model has a specific setting.
$user = App\User::first();
$user->settings()->has('some.setting');
$user->settings('template')->has('layout.boxed');
5.) Remove a setting from a model.
$user = App\User::first();
$user->settings()->delete('some.setting');
$user->settings('template')->delete('layout.boxed');
6.) Set the default settings for a new model.
If you define $defaultSettings as an array property on your model, we will use its value as the default settings for
any new models that are created without settings.
User.php
use NetkodBilisim\LaravelModelSettingsBag\ModelHasSettingsBag;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use ModelHasSettingsBag;
/**
* The model's default settings.
*
* @var array
*/
protected $defaultSettings = [
'homepage' => '/profile'
];
// truncated for brevity..
}
7.) Specify the settings that are allowed.
If you define $allowedSettings as an array property then only settings which match a value within
the $allowedSettings array will be saved on the model.
User.php
use NetkodBilisim\LaravelModelSettingsBag\ModelHasSettingsBag;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use ModelHasSettingsBag;
/**
* The model's allowed settings.
*
* @var array
*/
protected $allowedSettings = ['homepage'];
// truncated for brevity..
}
8.) Using another method name other than settings()
If you prefer to use another name other than settings , you can do so by defining a $mapSettingsTo property. This simply maps calls to the method (such as config()) to the settings() method.
User.php
use NetkodBilisim\LaravelModelSettingsBag\ModelHasSettingsBag;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use ModelHasSettingsBag;
/**
* The settings field name.
*
* @var string
*/
protected $mapSettingsTo = 'config';
}
License
This package is open source software licensed under the MIT License.