Laravel/FilamentPHP:刷新创建页面时保存已填写的输入内容
在FilamentPHP中实现创建页面刷新后恢复临时表单数据
实现思路
借助Livewire的生命周期钩子,结合session与浏览器cookie实时保存表单输入的临时数据,页面刷新时自动读取并填充表单内容。
具体代码实现
以文章创建页面为例,修改对应的CreateRecord页面类:
namespace App\Filament\Resources\ArticleResource\Pages; use App\Filament\Resources\ArticleResource; use Filament\Resources\Pages\CreateRecord; class CreateArticle extends CreateRecord { protected static string $resource = ArticleResource::class; /** * 页面加载时恢复临时数据 */ public function hydrate() { // 仅处理创建页,编辑页跳过 if ($this->getRecord()->exists) { return; } // 优先从session读取,session失效则读取cookie $savedData = session()->get('article_temp_data') ?? json_decode(request()->cookie('article_temp_data'), true); if ($savedData) { foreach ($savedData as $field => $value) { if (property_exists($this, $field)) { $this->$field = $value; } } } } /** * 监听表单字段更新,实时保存临时数据 */ public function updated($field, $value) { if (!$this->getRecord()->exists) { $tempData = session()->get('article_temp_data', []); $tempData[$field] = $value; // 保存到session(临时存储)和cookie(持久化1天) session()->put('article_temp_data', $tempData); cookie()->queue('article_temp_data', json_encode($tempData), 1440); } } /** * 文章创建成功后清除临时数据 */ protected function handleRecordCreation(array $data): \Illuminate\Database\Eloquent\Model { $record = parent::handleRecordCreation($data); // 清理session和cookie中的临时数据 session()->forget('article_temp_data'); cookie()->queue(cookie()->forget('article_temp_data')); return $record; } }
注意事项
- 该方案仅针对创建页面,编辑页因已有持久化数据,无需处理;
- 支持所有Filament表单组件(文本框、富文本、选择器等)的字段值保存与恢复;
- cookie有效期设置为1440分钟(1天),可根据需求调整;
- 若用户清除浏览器缓存或cookie,临时数据会丢失,这是前端存储的固有局限。
内容的提问来源于stack exchange,提问作者Dimitri kvachakhia
相关产品推荐
相关产品推荐

