教程 > gorm 教程 > 阅读:184

gorm 编写插件——迹忆客-ag捕鱼王app官网

callbacks

gorm 自身也是基于 callbacks 的,包括 createqueryupdatedeleterowraw。此外,我们也完全可以根据自己的意愿自定义 gorm

回调会注册到全局 *gorm.db,而不是会话级别。如果你想要 *gorm.db 具有不同的回调,那么需要初始化另一个 *gorm.db

注册 callback

注册 callback 至 callbacks

func cropimage(db *gorm.db) {
  if db.statement.schema != nil {
    // 裁剪图片字段并上传到cdn,dummy code
    for _, field := range db.statement.schema.fields {
      switch db.statement.reflectvalue.kind() {
      case reflect.slice, reflect.array:
        for i := 0; i < db.statement.reflectvalue.len(); i   {
          // 从字段中获取数值
          if fieldvalue, iszero := field.valueof(db.statement.reflectvalue.index(i)); !iszero {
            if crop, ok := fieldvalue.(cropinterface); ok {
              crop.crop()
            }
          }
        }
      case reflect.struct:
        // 从字段中获取数值
        if fieldvalue, iszero := field.valueof(db.statement.reflectvalue); !iszero {
          if crop, ok := fieldvalue.(cropinterface); ok {
            crop.crop()
          }
        }
        // 将值设置给字段
        err := field.set(db.statement.reflectvalue, "newvalue")
      }
    }
    // 当前实体的所有字段
    db.statement.schema.fields
    // 当前实体的所有主键字段
    db.statement.schema.primaryfields
    // 优先主键字段:带有数据库名称`id`或第一个定义的主键的字段。
    db.statement.schema.prioritizedprimaryfield
    // 当前模型的所有关系
    db.statement.schema.relationships
    // 使用字段名或数据库名查找字段
    field := db.statement.schema.lookupfield("name")
    // processing
  }
}
db.callback().create().register("crop_image", cropimage)
// 为create注册一个回调

删除 callback

从 callbacks 中删除回调

db.callback().create().remove("gorm:create")
// 从 create 的 callbacks 中删除 `gorm:create`

替换 callback

用一个新的回调替换已有的同名回调

db.callback().create().replace("gorm:create", newcreatefunction)
// 用新函数 `newcreatefunction` 替换 create 流程目前的 `gorm:create`

注册带顺序的 callback

注册带顺序的 callback

// gorm:create 之前
db.callback().create().before("gorm:create").register("update_created_at", updatecreated)
// gorm:create 之后
db.callback().create().after("gorm:create").register("update_created_at", updatecreated)
// gorm:query 之后
db.callback().query().after("gorm:query").register("my_plugin:after_query", afterquery)
// gorm:delete 之后
db.callback().delete().after("gorm:delete").register("my_plugin:after_delete", afterdelete)
// gorm:update 之前
db.callback().update().before("gorm:update").register("my_plugin:before_update", beforeupdate)
// 位于 gorm:before_create 之后 gorm:create 之前
db.callback().create().before("gorm:create").after("gorm:before_create").register("my_plugin:before_create", beforecreate)
// 所有其它 callback 之前
db.callback().create().before("*").register("update_created_at", updatecreated)
// 所有其它 callback 之后
db.callback().create().after("*").register("update_created_at", updatecreated)

预定义 callback

gorm 已经定义了 一些 callback 来支持当前的 gorm 功能,在启动您的插件之前可以先看看这些 callback


插件

gorm 提供了 use 方法来注册插件,插件需要实现 plugin 接口

type plugin interface {
  name() string
  initialize(*gorm.db) error
}

当插件首次注册到 gorm 时将调用 initialize 方法,且 gorm 会保存已注册的插件,你可以这样访问访问:

db.config.plugins[pluginname]

查看笔记

扫码一下
查看教程更方便
网站地图