akaunting/laravel-setting
Persistent settings for Laravel with database and/or JSON drivers. Includes helper, facade, and Blade directive, supports encryption, caching, auto-save, extra columns, and custom tables/files. Can override Laravel config values for production-friendly tweaks.
Installation:
composer require akaunting/laravel-setting
Publish the migration and config:
php artisan vendor:publish --provider="Akaunting\Setting\SettingServiceProvider"
Run migrations:
php artisan migrate
Define a Setting:
Create a setting class (e.g., app/Settings/AppSettings.php):
namespace App\Settings;
use Akaunting\Setting\Setting;
class AppSettings extends Setting
{
public $settings = [
'site_name' => ['string', 'My App'],
'maintenance_mode' => ['boolean', false],
'theme' => ['select', 'light', ['light', 'dark']],
];
}
First Use Case: Access a setting in a controller:
use App\Settings\AppSettings;
public function show()
{
$siteName = AppSettings::get('site_name');
return view('welcome', ['siteName' => $siteName]);
}
Dynamic Configuration: Use settings to replace hardcoded values (e.g., API keys, feature flags):
if (AppSettings::get('feature_new_ui')) {
return view('new-ui');
}
Admin Panel Integration: Create a form to update settings via a controller:
public function update(Request $request)
{
$validated = $request->validate(AppSettings::getValidationRules());
AppSettings::set($validated);
return redirect()->back()->with('success', 'Settings updated!');
}
Scoped Settings:
Extend Setting for tenant-specific configurations (e.g., TenantSettings):
class TenantSettings extends Setting
{
public $tenantId;
public $settings = [...];
}
Caching:
Enable caching in config/setting.php to reduce DB queries:
'cache' => true,
Validation Rules: Reuse validation rules in forms:
$rules = AppSettings::getValidationRules();
$this->app->singleton(AppSettings::class, function () {
return new AppSettings();
});
SettingUpdated events to trigger side effects (e.g., cache invalidation):
Setting::updated(function ($setting) {
Cache::forget('app_config');
});
public function handle($request, Closure $next)
{
if (AppSettings::get('maintenance_mode')) {
abort(503);
}
return $next($request);
}
Migration Conflicts:
$settings after initial migration, run:
php artisan setting:clear-cache
php artisan setting:reset.Caching Issues:
php artisan cache:clear
php artisan config:clear
AppSettings::setCache(false);
Default Values:
AppSettings::reset();
Case Sensitivity:
Mass Assignment:
set() calls. Use getValidationRules() to validate:
$validated = $request->validate(AppSettings::getValidationRules());
AppSettings::set($validated);
dd(AppSettings::all());
composer show akaunting/laravel-setting
Setting class to log updates:
protected function afterSave()
{
\Log::info('Setting updated', ['setting' => $this->settings]);
}
Custom Storage:
Override the storage engine by binding a custom SettingRepository:
$this->app->bind('setting.repository', function () {
return new CustomSettingRepository();
});
Custom Validation:
Add logic to getValidationRules():
public function getValidationRules()
{
$rules = parent::getValidationRules();
$rules['theme'][] = 'required_if:maintenance_mode,true';
return $rules;
}
Localization:
Translate setting labels by extending the Setting class:
public function getLabel($key)
{
return __("settings.{$key}");
}
How can I help you explore Laravel packages today?