Laravel10/FilamentPHP3:模态框动作后无刷新更新表单字段状态
解决FilamentPHP 3中refreshFormData不触发afterStateHydrated的问题
问题原因
refreshFormData() 仅从数据库拉取原始数据更新表单状态,不会重新触发表单字段的afterStateHydrated生命周期钩子,因此你定义的自定义格式化规则不会执行,导致updated_at显示数据库原始格式。
解决方案
方案1:改用formatStateUsing处理格式化(推荐)
formatStateUsing是Filament官方设计用于字段状态格式化的方法,每次渲染字段时都会执行,无论初始加载还是刷新数据后,都能保证格式正确:
use Carbon\Carbon; use Filament\Forms\Components\TextInput; // 表单字段定义 TextInput::make('updated_at') ->label('更新时间') ->disabled() ->formatStateUsing(function ($state) { // 应用你的自定义格式化规则 return Carbon::parse($state)->translatedFormat('d F, Y h:i A'); });
方案2:手动触发格式化逻辑(保留afterStateHydrated时使用)
若必须保留afterStateHydrated写法,可在调用refreshFormData()后手动处理字段状态:
- 抽离格式化逻辑为独立方法:
private function formatUpdatedAt($state) { return Carbon::parse($state)->translatedFormat('d F, Y h:i A'); }
- 字段定义中保留
afterStateHydrated:
TextInput::make('updated_at') ->label('更新时间') ->disabled() ->afterStateHydrated(function ($component, $state) { $component->state($this->formatUpdatedAt($state)); });
- 模态框操作完成后,刷新数据并手动更新字段:
// 执行完模态框内的更新操作后 $this->refreshFormData(); // 手动更新updated_at字段状态 $this->getForm()->getField('updated_at')->state( $this->formatUpdatedAt($this->record->updated_at) );
方案3:手动刷新模型并填充表单
放弃使用refreshFormData(),直接刷新模型实例后手动填充需要更新的字段:
// 模态框内完成更新操作后 $this->record->refresh(); // 从数据库重新加载最新数据 // 手动填充表单字段并应用格式化 $this->getForm()->fill([ 'status' => $this->record->status, // 其他需要更新的字段 'updated_at' => Carbon::parse($this->record->updated_at)->translatedFormat('d F, Y h:i A'), ]);
内容的提问来源于stack exchange,提问作者mstdmstd
相关产品推荐
相关产品推荐

