## Getting Started
### Minimal Setup
1. **Installation**:
```bash
composer require baks-dev/settings-main
php artisan vendor:publish --provider="BaksDev\SettingsMain\SettingsMainServiceProvider" --tag="settings-main-config"
config/settings-main.php.Database Migration:
php artisan migrate
settings, setting_groups).First Use Case:
Define a setting in config/settings-main.php:
'settings' => [
'app' => [
'maintenance_mode' => [
'type' => 'boolean',
'default' => false,
'label' => 'Enable Maintenance Mode',
],
],
],
Then register it via a console command or manually in the database.
config/settings-main.php – Centralized settings definition.BaksDev\SettingsMain\SettingsMainServiceProvider – Bootstraps the package.baks:assets:install – Installs default assets (if applicable).baks:settings:flush – Clears cached settings (debugging).database/migrations/[timestamp]_create_settings_tables.php – Schema for settings storage.Enable a toggleable feature (e.g., "Dark Mode"):
config/settings-main.php:
'features' => [
'dark_mode' => [
'type' => 'boolean',
'default' => false,
'label' => 'Enable Dark Mode',
],
],
$darkModeEnabled = setting('features.dark_mode');
Centralized Configuration:
Use config/settings-main.php to define all settings hierarchically (e.g., app.maintenance_mode).
'app' => [
'maintenance_mode' => [
'type' => 'boolean',
'default' => false,
'validation' => 'required|boolean',
],
],
string, boolean, integer, array, json (custom types can be extended via events).Dynamic Registration:
Register settings programmatically via the SettingsManager facade:
use BaksDev\SettingsMain\Facades\SettingsManager;
SettingsManager::register([
'new_setting' => [
'type' => 'string',
'default' => 'default_value',
],
]);
$value = setting('app.maintenance_mode'); // Returns boolean
.env if configured (check config/settings-main.php for env_fallback option).setting('app.maintenance_mode', true);
setting()->update([
'app.maintenance_mode' => true,
'features.dark_mode' => true,
]);
Validator:
$validator = Validator::make($request->all(), [
'maintenance_mode' => 'required|boolean|settings:app.maintenance_mode',
]);
// Access a nested setting
$value = setting('features.dark_mode');
// Update a group
setting()->updateGroup('features', ['dark_mode' => true]);
setting('tenant-123.app.maintenance_mode')).php artisan baks:settings:flush
setting()->flushTag('group-name') to invalidate specific groups.$this->app->singleton('settings', function () {
return setting();
});
event(new SettingUpdated('app.maintenance_mode', true));
class SettingPolicy {
public function update(User $user, string $key) {
return $user->isAdmin();
}
}
Extend Setting Types:
Create custom types by implementing BaksDev\SettingsMain\Contracts\SettingType:
class ColorSetting implements SettingType {
public function validate($value) {
return preg_match('/^#[0-9A-F]{6}$/i', $value);
}
}
Register via SettingsManager::extend('color', ColorSetting::class).
Custom Storage: Override the default Eloquent storage by binding a custom repository:
$this->app->bind(
\BaksDev\SettingsMain\Contracts\SettingRepository::class,
\App\Repositories\CustomSettingRepository::class
);
Setting.@foreach(setting()->groups() as $group)
<h3>{{ $group['label'] }}</h3>
@foreach($group['settings'] as $key => $setting)
<div>
<label>{{ $setting['label'] }}</label>
<input type="{{ $setting['type'] }}" name="settings[{{ $key }}]">
</div>
@endforeach
@endforeach
Case Sensitivity:
Setting keys are case-sensitive (e.g., app.MaintenanceMode ≠ app.maintenance_mode). Use consistent naming.
Validation Bypass:
Direct database updates (e.g., via raw SQL) skip Laravel validation. Always use setting()->update().
Caching Issues:
php artisan baks:settings:flush
setting()->flush() in production; use tags instead.Default Values:
Defaults in config/settings-main.php are not applied retroactively to existing settings. Use migrations or manual updates to reset values.
Type Mismatches:
Storing a string as an integer may cause silent failures. Validate types explicitly:
if (!is_bool(setting('app.maintenance_mode'))) {
setting('app.maintenance_mode', false);
}
Migration Conflicts: If manually editing migrations, ensure timestamps match the package’s default migrations to avoid conflicts.
Log Settings: Dump all settings for debugging:
\Log::info('All settings:', setting()->all());
Or use Tinker:
php artisan tinker
>>> setting()->all();
Check for Overrides: Settings can be overridden by:
env_fallback is true).file or redis cache).Event Listeners: Debug setting updates via events:
SettingUpdated::dispatch($key, $value);
Listen in EventServiceProvider:
protected $listen = [
SettingUpdated::class => [
\App\Listeners\LogSettingChange::class,
],
];
config/settings-main.php Options:
cache_driver: Override the default cache driver (e.g., redis).env_fallback: Enable to fall back to .env (e.g., SETTINGS_APP_MAINTENANCE_MODE=true).default_group: Set a default group for bulk operations.Database Schema: The package uses three tables by default:
settings: Stores key-value pairs.setting_groups: Groups settings hierarchically.setting_types: Defines custom types (if extended).Performance:
json columns.How can I help you explore Laravel packages today?