Skip to content

修改

go
func ModifyUser(c *gin.Context) {
   core := cosy.Core[model.User](c).SetValidRules(gin.H{
      "name": "omitempty",
      "email": "omitempty",
      // ... 其他字段
   })
   
   core.BeforeExecuteHook(encryptPassword).
   SetNextHandler(GetUser).Modify()
}

提示

路由规则中应包含 :id 参数,如 /user/:id

生命周期

  1. 客户端提交 Json,经过 Validator 验证并过滤暂存在 ctx.Payload 中,他是一个 gin.H 类型
  2. 查询原记录到 ctx.OriginModel
  3. BeforeDecode (Hook)
  4. 使用 mapstructure 将 ctx.Payload 映射到 ctx.Model
  5. BeforeExecute (Hook)
  6. 执行创建操作
  7. Executed (Hook)
  8. 返回响应
update

创建接口类似,我们提供三个钩子,分别是 BeforeDecodeHookBeforeExecuteHookExecutedHook

钩子名称ctx.OriginModelctx.Modelctx.Payload
BeforeDecodeHook原记录空结构体客户端提交的数据
BeforeExecuteHook原记录准备更新的数据客户端提交的数据
ExecutedHook原记录更新后的数据客户端提交的数据

注意,该接口在更新项目后,会再次查询数据库并使用 Preload(clause.Associations) 预加载所有的关联。

默认情况下,该接口会返回更新后的记录,如果需要直接跳转到下一个 Gin Handler Func,请使用 SetNextHandler(c *gin.Context) 方法。

字段保护

Cosy 会自动过滤掉 ValidRules 中不存在的字段,并且数据库更新时只会使用过滤后的字段列表作为限制条件, 如果你在 BeforeExecuteHook 中修改了 ctx.Model 的字段,但这些字段不在 ValidRules 中,那么这些字段将不会被更新。

如果需要更新这些字段,请在 BeforeExecuteHook 中使用

go
ctx.AddSelectedFields(fields ...string)

如需获取选定的字段,请在 BeforeExecuteHook 中使用

go
ctx.GetSelectedFields() string