illuminatech/config
Laravel package for editable application configuration. It lets you override config-file values at runtime and persist settings in the database, so you can build admin panels where application settings are changed without redeploying or editing files.
The package swaps Laravel's file-backed config repository for one that reads (and writes) overrides from persistent storage, so config('app.name') or Config::get('mail.from.address') silently returns the database value when one exists and falls back to config/*.php otherwise.
composer require illuminatech/configphp artisan vendor:publish --provider="Illuminatech\Config\ConfigServiceProvider". This gives you a config/config.php (model, table, cache settings) and migrations for the storage table (configs by default).php artisan migrate.Illuminatech\Config\ConfigServiceProvider in config/app.php — after the framework providers so the config container binding already exists.config:init) that walks your config/ directory and inserts rows, or you can seed manually.Where to look first: read the published config/config.php and the README's "Usage" section — the exact persistence method (Config::set() vs. a dedicated persist()/save() on the repository) has shifted across versions, and that distinction is the crux of day-to-day use. Verify it against the README for your pinned version before writing code around it.
First use case: any value an admin needs to change without a deploy — site name, feature toggles, mail sender, pagination sizes, third-party API endpoints. Anything you'd otherwise shoehorn into a settings table.
config(['key' => $v]) and persisted writes as two different operations. The repository lets you change a value for the current request without touching the DB, and separately write-through to storage. Don't accidentally call the persist path in a request loop.Config Eloquent model is the natural backing for a settings screen: list keys (ideally unioned with keys discovered from your config files), show the current value, and validate on save. Store the description/type so the UI can render the right input and cast the value back (see gotchas on casting).array, in production.RefreshDatabase plus SQLite :memory:; seed only the keys the test cares about. Assert against config() rather than the repository so you exercise the same path the app uses.php artisan config:cache is the big one. The cached config array is baked from files and will bypass your DB overrides entirely. Either exclude this app from config caching, or make sure the DB layer is applied after the cache is loaded (that's what the service provider wrapper is supposed to do — confirm it still works when bootstrap/cache/config.php exists). Test both cached and uncached boot paths."0" or "false" will bite you when it round-trips as truthy string — decide the cast rules once and enforce them in the model's casts.app('config') or resolves it before your provider registers, you get the vanilla repository. Register late and avoid resolving config inside other service providers' register() methods when possible.saving model event as a second gate.configs table, confirm the cache key is being cleared, confirm the provider is the illuminatech one (dump get_class(app('config'))), and confirm you're not comparing against a config:cached array.config/config.php can be swapped for one with your own casts/events; the cache store is configurable; and the repository binding itself can be decorated if you need audit logging on writes.NOASSERTION license mean you should read the LICENSE before shipping, pin the version, and be prepared to fork. It's a small package conceptually (a repository subclass plus a model and a command), so the blast radius if it's abandoned is low — but plan for it..env/secret managers and reserve this for operational values.How can I help you explore Laravel packages today?