Filament 如何为单条记录构建首页或设置等单资源页面【免费下载链接】filamentA powerful open-source UI framework for Laravel • Build and ship apps admin panels fast with Livewire项目地址: https://gitcode.com/GitHub_Trending/fi/filament当你需要在后台编辑一条唯一的记录——比如网站的首页、某个开关集合或全局设置——而 resource 的索引列表表格毫无意义时Filament 的常规 resource 并不合适。官方在 Singular resources 文档 中给出了一条直接路径Filament 没有专门的单资源功能而是用**自定义页面custom page 表单form**组合实现。本文以文档中的ManageHomepage示例为主线演示如何为一条固定的WebsitePage记录通过is_homepage true定位构建一个首页管理页面记录不存在时表单带默认值用户首次提交即创建记录已存在时页面加载即回填提交即更新。适用前提是已有一个跑起来的 Filament 面板。对于完整的Settings 页面或当前登录用户的 Profile 页面官方推荐改用 Spatie Settings 插件和 Filament 的 Profile 功能因为代码量更小本文的自定义页面方式适合任意单条记录的场景。准备工作模型与数据表单资源页面的核心是一个能被固定查询定位到的记录。文档示例使用WebsitePage模型。仓库内的演示应用WebsitePage.php定义了模型和迁移// app/Models/WebsitePage.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class WebsitePage extends Model { protected $guarded []; protected $casts [ is_homepage boolean, ]; }对应的 website_pages 表迁移 结构为Schema::create(website_pages, function (Blueprint $table): void { $table-id(); $table-string(title); $table-text(content)-nullable(); $table-boolean(is_homepage)-default(false); $table-timestamps(); });is_homepage字段就是这条记录是唯一的这一约束的落点getRecord()方法将用它来查出当前要编辑的记录。第一步生成自定义页面按照 Custom pages 文档 的命令生成页面类php artisan make:filament-page ManageHomepage该命令会创建两个文件页面类位于资源目录的/Filament/Pages目录下即app/Filament/Pages/ManageHomepage.phpBlade 视图位于 Filament 视图目录的/filament/pages目录下即resources/views/filament/pages/manage-homepage.blade.php。页面类本质上是完整的 Livewire 组件面板通过discoverPages()自动发现/Filament/Pages目录下的页面无需额外注册。第二步编写页面类页面类需要包含以下元素每项的作用均来自 singular 文档 的说明$data属性保存表单当前状态mount()从数据库加载记录并回填表单。记录不存在时fill()收到null表单字段会应用各自的默认值form()定义表单 schema。必须用record()指定表单加载关系数据所用的记录用statePath(data)指定表单状态存放的属性名save()把表单数据写入数据库。getState()会执行表单校验并返回合法数据。方法内需判断记录是否已存在不存在则新建用模型的wasRecentlyCreated属性判断记录是否刚创建是则关系字段也要一并保存保存后向用户发送确认通知getRecord()虽然非必需但建议实现供其他方法复用避免重复代码。完整类实现与 singular 文档 及演示应用中的 ManageHomepage.php 一致namespace App\Filament\Pages; use App\Models\WebsitePage; use Filament\Actions\Action; use Filament\Forms\Components\RichEditor; use Filament\Forms\Components\TextInput; use Filament\Notifications\Notification; use Filament\Pages\Page; use Filament\Schemas\Components\Actions; use Filament\Schemas\Components\Form; use Filament\Schemas\Schema; /** * property-read Schema $form */ class ManageHomepage extends Page { protected string $view filament.pages.manage-homepage; /** * var arraystring, mixed | null */ public ?array $data []; public function mount(): void { $this-form-fill($this-getRecord()?-attributesToArray()); } public function form(Schema $schema): Schema { return $schema -components([ Form::make([ TextInput::make(title) -required() -maxLength(255), RichEditor::make(content), // ... ]) -livewireSubmitHandler(save) -footer([ Actions::make([ Action::make(save) -submit(save) -keyBindings([mods]), ]), ]), ]) -record($this-getRecord()) -statePath(data); } public function save(): void { $data $this-form-getState(); $record $this-getRecord(); if (! $record) { $record new WebsitePage(); $record-is_homepage true; } $record-fill($data); $record-save(); if ($record-wasRecentlyCreated) { $this-form-record($record)-saveRelationships(); } Notification::make() -success() -title(Saved) -send(); } public function getRecord(): ?WebsitePage { return WebsitePage::query() -where(is_homepage, true) -first(); } }其中几个关键配置的作用-livewireSubmitHandler(save)表单提交时调用页面的save()方法Action::make(save)-submit(save)在表单底部渲染Save按钮点击即触发save()-keyBindings([mods])支持Ctrl/Cmd S快捷键提交属于可选配置-record($this-getRecord())指定表单关联的记录关系型字段的数据从该记录加载-statePath(data)表单状态写入$data属性。演示应用里还设置了导航图标与排序文档正文未展开仅示例代码中出现use Filament\Support\Icons\Heroicon; protected static string | BackedEnum | null $navigationIcon Heroicon::OutlinedHome; protected static ?int $navigationSort 5;第三步渲染 Blade 视图页面视图只需在x-filament::page布局中输出$this-form。生成的视图文件manage-homepage.blade.phpx-filament::page {{ $this-form }} /x-filament::page结果验证完成上述步骤后打开面板导航中的Manage Homepage页面由面板的discoverPages()自动发现并生成导航项按文档描述的行为核对记录尚不存在首次访问页面时表单显示为空/默认值首次提交表单后save()会新建一条is_homepage true的WebsitePage记录页面右上角出现标题为Saved的成功通知。记录已存在再次访问页面时mount()通过getRecord()查出该记录并回填title与content修改后提交记录被更新而非新建同样收到Saved通知。首次创建时的关系字段若表单中包含关系型字段save()中的wasRecentlyCreated分支会调用saveRelationships()确保新建记录的关系数据一并落库。页面标题、导航名、URL 可按 Custom pages 文档 自定义$title/getTitle()改标题$navigationLabel/getNavigationLabel()改导航项文字$slug改 URL。若需要限制访问可覆写canAccess()public static function canAccess(): bool { return auth()-user()-canManageSettings(); }canAccess()同时控制导航中是否显示该页面以及用户能否直接访问 URL。限制与选型边界这不是 Filament 内置的单资源功能而是官方文档推荐的组合实现页面类必须自己处理记录不存在则创建的逻辑。getRecord()的定位查询是这条路径的关键记录必须能用一个确定性的条件如is_homepage true唯一查出否则页面会编辑到错误的记录。若目标只是当前登录用户的资料编辑或多节设置页文档建议分别使用 Filament 的 Profile 功能和 Spatie Settings 插件代码量更小。表单字段与校验规则按 forms 文档 中各字段的配置方式添加示例中title必填且最长 255 字符与website_pages表结构对应。【免费下载链接】filamentA powerful open-source UI framework for Laravel • Build and ship apps admin panels fast with Livewire项目地址: https://gitcode.com/GitHub_Trending/fi/filament创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考