dick/settings
Database-backed application settings for Laravel. Define defaults in config, override them at runtime, and read values anywhere through a simple facade or helper. Values are cached so lookups stay fast, with migrations and an Artisan command for managing stored settings.
dick/settings depends on dick/crud, which is not auto-discovered on Laravel 5-era versions:
composer require dick/crud
composer require dick/settings
config/app.php (providers array):
Dick\Settings\SettingsServiceProvider::class,
php artisan vendor:publish --provider="Dick\Settings\SettingsServiceProvider"
php artisan migrate
SettingsCrudController (usually app/Http/Controllers/Admin/SettingCrudController.php) — this defines the fields available in the admin UI (key, value, type, and optionally a group/description). Extend it rather than editing the vendor copy.admin/setting, so editors can reach the interface.site_name setting in the UI, then read it anywhere with Setting::get('site_name') (or the package-provided helper, depending on version). Confirm the round-trip in php artisan tinker before wiring it into views.Setting::get('key', 'fallback') calls never have to handle "missing row" in production, and new environments bootstrap predictably.settings('mail.from', config('mail.from')) function keeps controllers/views clean and gives you one place to add caching later.Cache::rememberForever('settings') call) and bust the cache from the CRUD controller's store/update/destroy methods.group column and either split into multiple CRUD panels or filter the list in the controller. This preserves the "one settings screen per area" UX (e.g. "Mail", "Social", "Branding").type column (or a switch in the CRUD controller) to store booleans as 1/0, images as paths, arrays as JSON. Retrieve through accessors on an extended Setting model so callers get real types back.config(['mail.from' => settings('mail.from', config('mail.from'))]) in a service provider's boot().settings at a SQLite connection or skip the table entirely via a Setting::get wrapper that short-circuits when the table is missing.image, file) with the appropriate type => 'upload' config — this is where most day-to-day customization happens, not in the vendor code.dick/settings and dick/crud were renamed to backpack/settings and backpack/crud. If you are starting today, install Backpack instead — the concepts are identical but Backpack is maintained. Migrating an existing install is a namespace/config-key rename and is not trivial.--ignore-platform-reqs or a fork. Do not attempt to use it on Laravel 8+.key is a reserved word in MySQL. Quote it in raw queries or alias it (settings.key as setting_key) — otherwise you get cryptic syntax errors. Some migrations in this era renamed it to key_name for exactly this reason.value is TEXT. Booleans come back as "1"/"0", arrays as JSON strings. Cast on read; don't rely on the column type.Setting), or editors will change a value and see nothing happen./admin access. Add your own policy or middleware if some settings (e.g. SMTP credentials) should be super-admin only.value if you store API keys, and remember backups of the settings table then contain those secrets.vendor:publish is required — there is no auto-discovery in this era. If the UI 404s, you usually forgot to register the provider or forgot to publish the CRUD routes.dick/crud is missing or its provider is unregistered — fix that before debugging settings itself.Setting model (in app/) to add accessors/casts; override SettingsCrudController to add fields; use the service provider's bindings if you need to swap the repository. Never edit vendor/tabacitu/... directly — you will lose changes on composer update.How can I help you explore Laravel packages today?