Settings Migrations
Capell uses Spatie Laravel Settings for managing application settings. Settings migrations are different from regular database migrations.
Directory Structure
Section titled “Directory Structure”Settings migrations must be placed in the database/settings/ directory within a package, not database/migrations/:
packages/your-package/├── database/│ ├── migrations/ # ← Regular table migrations│ │ ├── create_tables.php│ │ └── add_columns.php│ └── settings/ # ← Settings migrations (MUST be here)│ ├── create_settings.php│ └── update_settings.phpCreating Settings Migrations
Section titled “Creating Settings Migrations”Settings migrations extend Spatie\LaravelSettings\Migrations\SettingsMigration:
<?php
declare(strict_types=1);
use Spatie\LaravelSettings\Migrations\SettingsMigration;
return new class extends SettingsMigration{ public function up(): void { // Use exists() check to avoid errors on re-runs if (! $this->migration-assistant->exists('mygroup.setting_key')) { $this->migration-assistant->add('mygroup.setting_key', 'default_value'); } }
public function down(): void { $this->migration-assistant->delete('mygroup.setting_key'); }};Publishing and Running Settings Migrations
Section titled “Publishing and Running Settings Migrations”In InstallCommand
Section titled “In InstallCommand”Register settings migrations in your package’s InstallCommand:
public function handle(): int{ $settings = __DIR__ . '/../../../database/settings';
$this->call('capell:publish-migrations', [ '--type' => 'settings', '--items' => [ 'create_my_settings', 'update_my_settings_add_field', // Later updates ], '--path' => $settings, ]);
$this->call('migrate');
return Command::SUCCESS;}Manual Publishing
Section titled “Manual Publishing”If a settings migration is added after initial installation:
php artisan capell:publish-migrations \ --type=settings \ --items="2026_04_18_000001_update_my_settings" \ --path="/path/to/package/database/settings"
php artisan migrateBest Practices
Section titled “Best Practices”✅ DO:
- Place settings migrations in
database/settings/ - Use
exists()checks to make migrations idempotent - Give migrations descriptive names:
update_settings_add_field - List all settings migrations in your
InstallCommand - Use clear naming:
create_*_settings.php,update_*_settings_*.php
❌ DON’T:
- Place settings migrations in
database/migrations/ - Add settings without existence checks (causes errors on re-run)
- Forget to register migrations in
InstallCommand - Create settings without a corresponding migration
Troubleshooting
Section titled “Troubleshooting”MissingSettings Exception
Section titled “MissingSettings Exception”If you see: Tried loading settings 'MyClass', and the following properties were missing: ...
Cause: Settings migration hasn’t been published or run.
Fix:
- Ensure migration is in
database/settings/directory - Ensure
InstallCommandlists the migration - Run:
php artisan capell:publish-migrations --type=settings ... - Run:
php artisan migrate
Settings Not Persisting
Section titled “Settings Not Persisting”Check that:
- Migration’s
up()method usesexists()check - The settings group name in migration matches Settings class
group() - Database
settingstable has the records