核心区别
| 方法 | 触发时机 | 可修改表单值 | 数据持久化状态 |
|---|---|---|---|
$form->saving() | 表单提交后,数据保存到数据库前触发 | ✔️ 生效 | 尚未保存到数据库 |
$form->saved() | 表单数据成功保存到数据库后触发 | ❌ 需手动处理 | 已生成完整模型数据 |
使用场景对比
1. $form->saving() - 保存前干预
典型场景:修改即将存储的原始数据
特点:直接修改表单输入值,最终会随表单提交保存到数据库
$form->saving(function (Form $form) {
// 直接修改表单字段值(生效)
$form->input('price', $form->input('price') * 0.8); // 自动打8折
// 或通过模型属性修改(需模型已实例化)
if ($form->model()->exists) {
$form->model()->slug = Str::slug($form->title);
}
});2. $form->saved() - 保存后处理
典型场景:基于已存储数据的后续操作
注意:此时修改模型数据需手动保存,且要避免无限循环
$form->saved(function (Form $form) {
// 获取已保存的模型实例
$model = $form->model();
// 修改数据需显式保存
$model->update_count += 1;
$model->save(); // 必须手动调用
// 典型场景:关联操作/异步任务
Log::info('数据更新', $model->toArray());
dispatch(new SendUpdateNotification($model));
});常见问题示例
Q:为什么在 saved() 中修改数据无效?
错误示范:
$form->saved(function (Form $form) {
$form->model()->price = 100; // 未调用 save()
});修正方案:
$form->saved(function (Form $form) {
$model = $form->model();
$model->price = 100;
$model->save(); // 必须显式保存
});最佳实践建议
数据预处理优先使用
saving()- 字段格式化
- 自动生成 slug
- 计算衍生字段值
后置操作使用
saved()- 写入操作日志
- 清理缓存
- 触发异步任务
避免循环触发
在saved()中保存模型时添加条件判断:$form->saved(function (Form $form) { if ($form->model()->isDirty()) { // 检查是否有修改 $form->model()->save(); } });
通过合理运用这两个回调,可以实现表单数据处理的全生命周期管理。关键要牢记:saving 管存前加工,saved 管存后跟进。
评论 (0)