编写插件

回调

GORM 利用 回调 来实现其核心功能。这些回调为各种数据库操作(如 创建查询更新删除原始)提供钩子,允许对 GORM 的行为进行广泛的自定义。

回调是在全局 *gorm.DB 级别注册的,而不是在会话基础上注册的。这意味着如果您需要不同的回调行为,则应初始化一个单独的 *gorm.DB 实例。

注册回调

您可以为特定操作注册回调。例如,要添加自定义图像裁剪功能

func cropImage(db *gorm.DB) {
if db.Statement.Schema != nil {
// crop image fields and upload them to 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++ {
// Get value from field
if fieldValue, isZero := field.ValueOf(db.Statement.Context, db.Statement.ReflectValue.Index(i)); !isZero {
if crop, ok := fieldValue.(CropInterface); ok {
crop.Crop()
}
}
}
case reflect.Struct:
// Get value from field
if fieldValue, isZero := field.ValueOf(db.Statement.Context, db.Statement.ReflectValue); !isZero {
if crop, ok := fieldValue.(CropInterface); ok {
crop.Crop()
}
}

// Set value to field
err := field.Set(db.Statement.Context, db.Statement.ReflectValue, "newValue")
}
}

// All fields for current model
db.Statement.Schema.Fields

// All primary key fields for current model
db.Statement.Schema.PrimaryFields

// Prioritized primary key field: field with DB name `id` or the first defined primary key
db.Statement.Schema.PrioritizedPrimaryField

// All relationships for current model
db.Statement.Schema.Relationships

// Find field with field name or db name
field := db.Statement.Schema.LookUpField("Name")

// processing
}
}

// Register the callback for the Create operation
db.Callback().Create().Register("crop_image", cropImage)

删除回调

如果不再需要回调,可以将其删除

// Remove the 'gorm:create' callback from Create operations
db.Callback().Create().Remove("gorm:create")

替换回调

可以使用新函数替换同名的回调

// Replace the 'gorm:create' callback with a new function
db.Callback().Create().Replace("gorm:create", newCreateFunction)

回调排序

可以注册具有特定顺序的回调,以确保它们在操作生命周期的正确时间执行。

// Register to execute before the 'gorm:create' callback
db.Callback().Create().Before("gorm:create").Register("update_created_at", updateCreated)

// Register to execute after the 'gorm:create' callback
db.Callback().Create().After("gorm:create").Register("update_created_at", updateCreated)

// Register to execute after the 'gorm:query' callback
db.Callback().Query().After("gorm:query").Register("my_plugin:after_query", afterQuery)

// Register to execute after the 'gorm:delete' callback
db.Callback().Delete().After("gorm:delete").Register("my_plugin:after_delete", afterDelete)

// Register to execute before the 'gorm:update' callback
db.Callback().Update().Before("gorm:update").Register("my_plugin:before_update", beforeUpdate)

// Register to execute before 'gorm:create' and after 'gorm:before_create'
db.Callback().Create().Before("gorm:create").After("gorm:before_create").Register("my_plugin:before_create", beforeCreate)

// Register to execute before any other callbacks
db.Callback().Create().Before("*").Register("update_created_at", updateCreated)

// Register to execute after any other callbacks
db.Callback().Create().After("*").Register("update_created_at", updateCreated)

预定义回调

GORM 附带了一组预定义的回调,用于驱动其标准功能。建议在创建自定义插件或其他回调函数之前,先查看这些已定义的回调

插件

GORM 的插件系统允许轻松扩展和自定义其核心功能,从而在维护模块化架构的同时增强应用程序的功能。

插件 接口

要为 GORM 创建插件,您需要定义一个实现 插件 接口的结构体

type Plugin interface {
Name() string
Initialize(*gorm.DB) error
}
  • 名称 方法:返回插件的唯一字符串标识符。
  • 初始化 方法:包含设置插件的逻辑。当插件首次在 GORM 中注册时,将调用此方法。

注册插件

一旦您的插件符合 插件 接口,您就可以使用 GORM 实例注册它

// Example of registering a plugin
db.Use(MyCustomPlugin{})

访问已注册插件

插件注册后,它将存储在 GORM 的配置中。您可以通过 插件 映射访问已注册的插件

// Access a registered plugin by its name
plugin := db.Config.Plugins[pluginName]

实际示例

GORM 插件的一个示例是 Prometheus 插件,它将 Prometheus 监控与 GORM 集成在一起

// Registering the Prometheus plugin
db.Use(prometheus.New(prometheus.Config{
// Configuration options here
}))

Prometheus 插件文档 提供了有关其实现和使用的详细信息。

铂金赞助商

黄金赞助商

铂金赞助商

黄金赞助商