share-lt/docs/decisions/003-initial-model-and-filament-resource.md
2026-01-02 15:46:42 +00:00

3.1 KiB
Raw Blame History

2026-01-02

Entry model

php artisan make:model -m Entry

creates skeleton files for a model and migration

we edit the migration to hold the fields we desire to be present in each record

just the minimal are added for now, paying attention to the amount of data that these may need to hold

  • string (varchar): ~255 chars default.
  • text: ~65 KB.
  • mediumText: ~16 MB.
php artisan migrate

runs the migration to create the table

Entry filament resource

 php artisan filament:resource Entry

 The "title attribute" is used to label each record in the UI.

 You can leave this blank if records do not have a title.

 ┌ What is the title attribute for this model? ─────────────────┐
 │ title                                                        │
 └──────────────────────────────────────────────────────────────┘

 ┌ Would you like to generate a read-only view page for the resource? ┐
 │ Yes                                                                │
 └────────────────────────────────────────────────────────────────────┘

 ┌ Should the configuration be generated from the current database columns? ┐
 │ Yes                                                                      │
 └──────────────────────────────────────────────────────────────────────────┘

   INFO  Filament resource [App\Filament\Resources\Entries\EntryResource] created successfully.  

There is more work to do on this model but for now, a new resource is added to the admin panel by which records can be added, edited, listed.

Full CRUD is already possible. This is amazing if you think how long this would have taken to create all this manually.

slugify

                    TextInput::make('title')
                        ->required()
                        ->reactive()
                        ->afterStateUpdated(function ($state, $set): void {
                            $set('slug', Str::slug((string) $state));
                        }),
                    TextInput::make('slug')
                        ->required(),

adding reactive and afterStateUpdted to title automatically creates a safe slug

I class things like this creature comforts of the framework and it shows how simple it can be to make fields active and updated by previous entries

For the user, this reduces error and confusion over what a url should be

rich editor

just changing the TextInput for content

                RichEditor::make('content')
                    ->columnSpanFull(),

to RichEditr gives us a 'tiptap' rich text editor

already, this is feeling more like a mini CMS, with relatively little effort