在 Filamentphp 開發過程中,使用 Spatie Setting 插件,一開始一直卡關,所以寫這篇文章記錄一下。

安裝 Spatie Setting 插件

插件 filament-spatie-settings

安裝 spatie-laravel-settings-plugin

composer require filament/spatie-laravel-settings-plugin:"^3.2" -W

安裝相關 migration 和 class

spatie/laravel-settings 這個套件,所以需要根據 installation 來安裝相關 migration 和 class

安裝 migration

php artisan vendor:publish --provider="Spatie\LaravelSettings\LaravelSettingsServiceProvider" --tag="migrations"
php artisan migrate

你會取得 migration 如下,並且執行 migrate

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up()
    {
        Schema::create('settings', function (Blueprint $table): void {
            $table->id();

            $table->string('group');
            $table->string('name');
            $table->boolean('locked')->default(false);
            $table->json('payload');

            $table->timestamps();

            $table->unique(['group', 'name']);
        });
    }
};

安裝 class

publish setting 的 class,位置 app/Settings

php artisan vendor:publish --provider="Spatie\LaravelSettings\LaravelSettingsServiceProvider" --tag="config"

製作 setting class

# php artisan make:setting SettingName --group=groupName 
php artisan make:filament-settings-page ManageGeneras GeneralSettings

這樣就會在 app/Settings 目錄下產生一個 GeneralSettings.php 的檔案。

use Spatie\LaravelSettings\Settings;

class GeneralSettings extends Settings
{
    public string $site_name;
    public bool $site_active;
    
    public static function group(): string
    {
        return 'general';
    }
}

新增你的 setting class 到你的 /config/settings.php

    /*
     * Each settings class used in your application must be registered, you can
     * add them (manually) here.
     */
    'settings' => [
        GeneralSettings::class
    ],

產生需要的 properties

php artisan make:settings-migration CreateGeneralSettings

這樣會在 database/database/settings 目錄下產生一個 ...create_general_settings.php 的檔案。

use Spatie\LaravelSettings\Migrations\SettingsMigration;

return new class extends SettingsMigration
{
    public function up(): void
    {
        $this->migrator->add('general.site_name', 'Spatie');
        $this->migrator->add('general.site_active', true);
    }
}
php artisan migrate

這樣就完成 spatie/laravel-settings 基礎設定

準備 filament setting Resource

php artisan make:filament-settings-page ManageGeneras GeneralSettings 

這樣會在 app/Filament/Pages 下產生一個 ManageGenerals.php,確認 $settings 是不是剛剛的 Setting class

protected static string $settings = GeneralSettings::class;

輸入在自己的 Resource 裡面,然後在 form() 方法裡面新增欄位。

use Filament\Forms\Components\Repeater;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Form;
 
public function form(Form $form): Form
{
    return $form
        ->schema([
            TextInput::make('copyright')
                ->label('Copyright notice')
                ->required(),
            Repeater::make('links')
                ->schema([
                    TextInput::make('label')->required(),
                    TextInput::make('url')
                        ->url()
                        ->required(),
                ]),
        ]);
}

結果如下

result.png