DcatAdmin 中 $form->saving() 与 $form->saved() 的区别及实战示例

DcatAdmin 中 $form->saving() 与 $form->saved() 的区别及实战示例

Yesr00
2025-02-06 / 0 评论 / 4,637 阅读 / 正在检测是否收录...

核心区别

方法触发时机可修改表单值数据持久化状态
$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(); // 必须显式保存
});

最佳实践建议

  1. 数据预处理优先使用 saving()

    • 字段格式化
    • 自动生成 slug
    • 计算衍生字段值
  2. 后置操作使用 saved()

    • 写入操作日志
    • 清理缓存
    • 触发异步任务
  3. 避免循环触发
    saved() 中保存模型时添加条件判断:

    $form->saved(function (Form $form) {
     if ($form->model()->isDirty()) { // 检查是否有修改
         $form->model()->save();
     }
    });

通过合理运用这两个回调,可以实现表单数据处理的全生命周期管理。关键要牢记:saving 管存前加工,saved 管存后跟进

0

评论 (0)

取消