sashalenz/laravel-settings-ui
| Install | |
|---|---|
composer require sashalenz/laravel-settings-ui |
|
| Latest Version: | v1.0.2 |
| PHP: | ^8.3|^8.4|^8.5 |
| Laravel: | 11 · 12 · 13 |
| License: | MIT |
| Last Updated: | Oct 3, 2026 |
| Links: | GitHub · Packagist |
Laravel Settings UI
Declarative, nestable runtime settings for Laravel — fluent schema, pluggable stores, secure secrets, resilient cache, transparent config() overlay, and a bundled responsive admin UI built with Livewire and Tailwind CSS.
✨ Features
- Code-Authoritative Declarations: Settings are defined in strongly typed PHP classes, never in the database.
- Zero-Coupling
config()Overlay: Application code continues to readconfig('group.key')without any dependency on the settings machinery. - Deep Hierarchical Nesting: Groups, subgroups, cards, sections, and fields mirror full dotted paths (
group.section.key). - Pluggable Storage Backends: Database, Encrypted Database, File (JSON/YAML), and external Secret Stores (Vault, AWS Secrets Manager, etc.).
- Pluggable & Secure Secrets Engine:
- Masked values in HTML and Livewire states.
- Zero-plaintext leaks in logs and exception traces.
- Rate-limited and permission-gated "Click to Reveal" action.
- Resilient & Stampede-Protected Cache:
- Stores primitive values only (zero risk of
__PHP_Incomplete_Classserialization bugs). - Schema fingerprinting & version-stamped keys.
- Cache stampede prevention via cache locks.
- Queue worker / Octane auto-refresh hooks.
- Stores primitive values only (zero risk of
- Full Audit History & Revert:
- Automatically records user, timestamp, before/after values, and source.
- One-click rollback to prior versions.
- Modular & Domain Discovery:
- Register settings from packages, modules, or domains (
Settings::register(...)orSettings::discover(...)). - Composer
extra.laravel-settingsdiscovery.
- Register settings from packages, modules, or domains (
- Seeder Engine & CLI:
SettingsSeederfor idempotent seeding (syncMissing()andforceSync()).- Artisan commands:
settings:sync,settings:seed,settings:doctor,settings:clear-cache.
📦 Installation
Install via Composer:
composer require sashalenz/laravel-settings-ui
Publish configuration and migrations:
php artisan vendor:publish --tag="settings-config"
php artisan vendor:publish --tag="settings-migrations"
php artisan migrate
🚀 Quick Start
1. Declare a Setting Schema
Create a schema class implementing DeclaresSettings:
namespace App\Settings;
use SashaLenz\SettingsUi\Contracts\DeclaresSettings;
use SashaLenz\SettingsUi\Schema\Field;
use SashaLenz\SettingsUi\Schema\Group;
final class GeneralSettings implements DeclaresSettings
{
public function schema(): Group
{
return Group::make('general')
->label('General Settings')
->icon('heroicon-o-cog')
->fields([
Field::text('site_name')
->label('Website Name')
->default('My App')
->rules(['required', 'string', 'max:255']),
Field::boolean('maintenance_mode')
->label('Maintenance Mode')
->default(false),
Field::text('api_token')
->label('API Secret Token')
->secret()
->store('secrets'),
]);
}
}
2. Register the Schema
In your config/settings.php:
'schemas' => [
\App\Settings\GeneralSettings::class,
],
Or programmatically in any ServiceProvider:
use SashaLenz\SettingsUi\Facades\Settings;
public function boot(): void
{
Settings::register([
\App\Settings\GeneralSettings::class,
]);
// Or discover all settings across domain modules:
Settings::discover([
app_path('Domain/*/Settings'),
]);
}
3. Read Values Transparently
// Stored database value automatically overlays config file default:
$siteName = config('general.site_name');
// Or using the Settings facade:
$siteName = Settings::get('general.site_name');
🔐 Secrets Management
Mark fields as secret to encrypt them and prevent plaintext exposure in forms and logs:
Field::text('stripe_secret')
->secret()
->store('secrets')
Supported Drivers:
encrypted-db: Encrypted locally in your database using Laravel'sAPP_KEY.env: Resolves from.envenvironment variables.vault: HashiCorp Vault KV v1/v2 engine.aws: AWS Secrets Manager.
🌱 Seeding Settings
Seed declared defaults safely without overwriting existing settings:
use SashaLenz\SettingsUi\Database\Seeders\SettingsSeeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
$this->call(SettingsSeeder::class);
}
}
Or via Artisan CLI:
php artisan settings:seed
php artisan settings:seed --group=general --force
🖥 Admin UI
Mount the routes in your routes file (e.g., routes/web.php):
use SashaLenz\SettingsUi\Facades\Settings;
Route::prefix('admin')->middleware(['web', 'auth'])->group(function () {
Settings::routes();
});
Available routes:
/admin/settings— List of setting groups/admin/settings/{group}— Group editor form/admin/settings/history— Audit change log & revert/admin/settings/schema— Read-only schema inspector
🧪 Testing
composer test
composer format
composer analyse
📄 License
The MIT License (MIT). Please see License File for more information.
Related Packages
Simple package which dcode uses to handle application configuration and setting...
Configuration settings management for Laravel with scoped values, typed casts an...
Version History
| Version | Released | PHP | Laravel | License |
|---|---|---|---|---|
| v1.0.2 | ^8.3| | ^11.0| | MIT | |
| v1.0.1 | ^8.3| | ^11.0| | MIT | |
| v1.0.0 | ^8.3| | ^11.0| | MIT |