跳转到内容

从 v1.14 升级到 v1.15

令人兴奋的新功能 🎉

增强功能 🚀

破坏性变更 🛠

v1.15.3

v1.15.4

升级相关包:goravel/gin: v1.3.3, goravel/fiber: v1.3.3

v1.15.5

升级相关包:goravel/redis: v1.3.1, goravel/fiber: v1.3.4

v1.15.6

升级指南

预计升级时间:10分钟

由于 Golang v1.21 不再维护,Goravel 支持的 Golang 版本已从 1.21 升级到 1.22。 请更新 go.mod 文件中的版本。

1。 更新依赖

go get -u github.com/goravel/framework@v1.15.2

// 如果使用 gin
go get -u github.com/goravel/gin@v1.3.2

// 如果使用 fiber
go get -u github.com/goravel/fiber@v1.3.2

// 如果使用 redis
go get -u github.com/goravel/redis@v1.3.0

// 如果使用 S3
go get -u github.com/goravel/s3@v1.3.2

// 如果使用 Oss
go get -u github.com/goravel/oss@v1.3.2

// 如果使用 Cos
go get -u github.com/goravel/cos@v1.3.2

// 如果使用 Minio
go get -u github.com/goravel/minio@v1.3.2

// 如果使用 Cloudinary
go get -u github.com/goravel/cloudinary@v1.3.1
go mod tidy

2。 如果您正在使用 Postgresql 驱动

需要相应修改:Postgresql 驱动名称更改为 Postgres

3。 如果您正在使用 Orm.Transaction 方法

需要相应修改:修改 Orm.Transaction 方法回调参数类型

4. 如果您正在使用 Orm 的 Delete 或 ForceDelete 方法

需要相应修改:优化 Orm 的 Delete 和 ForceDelete 方法

5. 如果您正在使用 Cache 的 Decrement 和 Increment 方法

需要相应修改:优化 Cache 的 Decrement 和 Increment 方法

6. 如果您正在使用 Queue 模块的 Worker 方法

需要相应修改:优化 Queue 模块的 Worker 方法

7. 如果您正在使用 Artisan 的 Call 方法

需要相应修改:优化 Artisan 的 Call 方法

8。 如果您正在使用 Testing.Database 的 Clear 方法

需要相应修改:将 Testing.Database 的 Clear 方法重命名为 Shutdown

9。 如果您正在使用 Testing.Database 的 Build 方法

需要相应修改:优化 Testing.Database 的 Build 方法

10。 如果您正在使用 Migration 模块

修改 config/database.go 中的配置:

go
-- "migrations": "migrations",
++ "migrations": map[string]any{
++  "driver": "sql",
++  "table":  "migrations",
++ },

11。 如果您正在使用 Request.Input* 方法

需要相应修改:优化 Request.Input* 方法

12。 如果您正在使用 validation.PrepareForValidation 方法

需要相应修改:优化 validation.PrepareForValidation 方法

13。 如果您正在使用 Mail 模块

修改 Subject 的设置方式:

go
-- import "github.com/goravel/framework/contracts/mail"
++ import "github.com/goravel/framework/mail"

-- Content(mail.Content{Subject: "Subject", Html: "<h1>Hello Goravel</h1>"})
++ Content(mail.Html("<h1>Hello Goravel</h1>")).Subject("Subject")

如果您正在使用 From 方法:

go
-- import "github.com/goravel/framework/contracts/mail"
++ import "github.com/goravel/framework/mail"

-- From(mail.From{Address: testFromAddress, Name: testFromName}
++ From(mail.Address(testFromAddress, testFromName)

如果您正在使用 Queue 方法:

go
-- import "github.com/goravel/framework/contracts/mail"
++ import "github.com/goravel/framework/mail"

-- Queue(mail.Queue{Connection: "high", Queue: "mail"})
++ Queue(mail.Queue().Connection("high").Queue("mail"))

14。 如果您正在使用 validation.PrepareForValidation 方法

需要相应修改:优化 validation.PrepareForValidation 方法

功能介绍

迁移支持使用 Go 语言迁移

之前,框架只支持 SQL 迁移。 当您想要切换数据库时,不同数据库之间的 SQL 语法差异使得迁移过程变得极其困难。 此外,无法在迁移文件中执行代码,使得在修复数据时无法进行逻辑判断。

现在,框架支持直接使用 Go 语言生成迁移文件,使开发人员能够轻松编写复杂的迁移逻辑。 然而,在当前版本中,尚未实现表字段的修改,仅支持创建表、删除表和创建索引等操作。 如果您想进行修改,需要使用 Sql 方法直接执行 SQL 语句。 在未来版本中将支持修改表 字段的功能。

在 v1.15 版本中,框架同时支持 Go 语言迁移(默认)和 SQL 迁移,但 SQL 迁移将在 v1.16 版本中被移除。

从 SQL 迁移切换到 Go 语言迁移

如果你正在使用 SQL 迁移,可以按照以下步骤切换到 Go 语言迁移:

  1. 修改 config/database.go 中的配置;
go
-- "migrations": "migrations",
++ "migrations": map[string]any{
++  "driver": "default",
++  "table":  "migrations",
++ },
  1. 使用 go run . artisan make:migration {NAME} 命令创建迁移文件;

在生成的文件的 UpDown 方法中执行原始 SQL 迁移文件中的迁移和回滚语句,并使用 facades.Schema().HasTable 方法检查表是否存在:

go
func (r *M20241207095921CreateUsersTable) Up() error {
  if !facades.Schema().HasTable("users") {
    return facades.Schema().Sql({SQL})
  }

  return nil
}
  1. database/kernel.go 文件中注册迁移文件;

创建一个新的 database/kernel.go 文件并注册迁移文件和种子:

go
package database

import (
  "github.com/goravel/framework/contracts/database/schema"
  "github.com/goravel/framework/contracts/database/seeder"

  "goravel/database/migrations"
  "goravel/database/seeders"
)

type Kernel struct {
}

func (kernel Kernel) Migrations() []schema.Migration {
  return []schema.Migration{
    &migrations.M20241207095921CreateUsersTable{},
  }
}

func (kernel Kernel) Seeders() []seeder.Seeder {
  return []seeder.Seeder{
    &seeders.DatabaseSeeder{},
  }
}
  1. 修改 app/providers/database_service_provider.go 文件完成注册,并将原本在这里注册的 Seeder 移动到 database/kernel.go::Seeders
go
-- func (receiver *DatabaseServiceProvider) Boot(app foundation.Application) {
--  facades.Seeder().Register([]seeder.Seeder{
--   &seeders.DatabaseSeeder{},
--  })
-- }
++ func (receiver *DatabaseServiceProvider) Boot(app foundation.Application) {
++  kernel := database.Kernel{}
++  facades.Schema().Register(kernel.Migrations())
++  facades.Seeder().Register(kernel.Seeders())
++ }
  1. 备份现有的 migrations 表数据,然后删除 migrations 表;

  2. 执行 go run .。 artisan migrate命令执行迁移,迁移完成后会生成新的migrations` 表。

查看文档

测试支持 HTTP 测试

goravel/framework: v1.15.0

框架新增了 Testing.Http 模块,支持 HTTP 请求测试,可以模拟请求、获取响应、断言响应。

查看文档

HTTP 支持返回流

goravel/framework: v1.15.0

查看文档

HTTP 支持设置超时

goravel/framework: v1.15.0

您可以通过在 config/http.go 文件中配置 http.request_timeout 来设置超时时间,默认为 3 秒。

HTTP 支持设置自定义恢复方法

goravel/framework: v1.15.0

查看文档

请求支持配置过滤器

goravel/framework: v1.15.0

查看文档

请求添加了 BindQuery 方法

goravel/framework: v1.15.0

支持使用 ctx.Request().BindQuery() 直接从链接绑定参数。

查看文档

验证支持正则表达式规则

goravel/framework: v1.15.0

go
validator, err := ctx.Request().Validate(map[string]string{
  "code": `required|regex:^\d{4,6}$`,
})

调度支持控制日志输出

goravel/framework: v1.15.0

app.debugfalse 时,只会输出 error 级别的日志。

调度添加 Shutdown 方法

goravel/framework: v1.15.0

Shutdown 方法可用于优雅地停止调度。

查看文档

Mail 支持 Mailable 模板

goravel/framework: v1.15.0

查看文档

错误日志输出中的跟踪支持跳转

goravel/framework: v1.15.0

在错误日志输出中,点击跟踪将跳转到发生错误的代码行。

Log 支持打印 Context 中的键值对

goravel/framework: v1.15.0

go
ctx.WithValue("a", "b")
facades.Log().WithContext(ctx).Info("Hello Goravel")

// 输出:
[2024-12-15 16:36:58] local.info: Hello Goravel 
Context: map[a:b]

支持直接设置 DSN 连接数据库

goravel/framework: v1.15.0

查看文档

Orm 的 Create 方法支持使用 map 创建

goravel/framework: v1.15.0

查看文档

Orm 添加配置项

goravel/framework: v1.15.0

这些配置项针对特定情况使用,正常使用不需要,默认不添加到配置文件中。

go
// config/database.go
"{driver_name}": map[string]any{
  "driver":   "{driver_name}",
  "host":     config.Env("DB_HOST", "127.0.0.1"),
  ...
++ "schema": "goravel",// Set the default schema for the connection, only for Postgres and SQL Server
++ "no_lower_case": false,// Set whether to convert the table name to lowercase
++ "name_replacer": strings.NewReplacer("id", "ID"),// Set the columns name replacement
},

Orm 添加 Restore 方法

goravel/framework: v1.15.0

Orm 模块中添加 Restore 方法,可用于恢复软删除的数据,并添加 RestoredRestoring 事件。

查看文档

Orm 的日志集成到 Log 模块

goravel/framework: v1.15.0

之前,Orm 的日志输出是直接输出到控制台,现在 Orm 的日志输出将集成到 Log 模块中,可以同时打印到控制台和日志文件。

Postgres 和 SQL Server 驱动程序支持 Schema

goravel/framework: v1.15.0

查看文档

添加 about 命令

goravel/framework: v1.15.0

添加 about 命令,可用于查看框架版本、配置等信息。

bash
go run . artisan about

添加 db:show 命令

goravel/framework: v1.15.0

添加 db:show 命令,可用于查看数据库连接信息。

bash
go run . artisan db:show

添加 db:table 命令

goravel/framework: v1.15.0

添加 db:table 命令,可用于查看表结构。

bash
go run . artisan db:table
go run . artisan db:table users

优化 Artisan 输出样式

goravel/framework: v1.15.0

优化 Artisan 输出样式,添加颜色,使输出更美观。

Auth 添加 Id 方法

goravel/framework: v1.15.0

go
id, err := facades.Auth(ctx).ID()

多个 Auth.Guard 可以设置自己的 TTL

goravel/framework: v1.15.0

之前,多个 Guards 共享 jwt.ttl 配置。 现在您可以通过在 config/auth.go 文件中设置来为每个 Guard 单独设置 TTL。 如果未设置,默认将使用 jwt.ttl 配置。

go
// config/auth.go
"guards": map[string]any{
  "user": map[string]any{
    "driver": "jwt",
++  "ttl": 60,
  },
},

Postgresql 驱动程序名称更改为 Postgres

goravel/framework: v1.15.0

Postgresql 驱动的名称已更改为 postgres。 如果您正在使用 Postgresql 驱动,您需要修改配置文件:

go
// config/database.go
"postgres": map[string]any{
  -- "driver":   "postgresql",
  ++ "driver":   "postgres",
  "host":     config.Env("DB_HOST", "127.0.0.1"),
}

修改 Orm.Transaction 方法回调参数类型

goravel/framework: v1.15.0

facades.Orm().Transaction() 方法回调参数类型已从 func(tx orm.Transaction) error 更改为 func(tx orm.Query) error,如果您正在使用此方法,请相应地进行修改。

go
-- facades.Orm().Transaction(func(tx orm.Transaction) error {
++ facades.Orm().Transaction(func(tx orm.Query) error {
  var user models.User

  return tx.Find(&user, user.ID)
})

优化 Orm 的 Delete 和 ForceDelete 方法

goravel/framework:v1.15.0

如果您正在向 DeleteForceDelete 方法传递 ID 来删除数据,请改用 Where 方法:

go
-- facades.Orm().Query().Delete(&models.User{}, 10)
++ facades.Orm().Query().Where("id", 10).Delete(&models.User{})

-- facades.Orm().Query().Delete(&models.User{}, []uint{1, 2, 3})
++ facades.Orm().Query().WhereIn("id", []uint{1, 2, 3}).Delete(&models.User{})

-- facades.Orm().Query().ForceDelete(&models.User{}, 10)
++ facades.Orm().Query().ForceDelete("id", 10).Delete(&models.User{})

DeleteForceDelete 方法支持不传递参数删除数据:

go
res, err := facades.Orm().Query().Model(&models.User{}).Where("id", 1).Delete()
res, err := facades.Orm().Query().Table("users").Where("id", 1).Delete()

优化 Cache 的 Decrement 和 Increment 方法

goravel/framework:v1.15.0

方法 DecrementIncrement 的输入和输出类型已从 int 更改为 int64

go
-- Decrement(key string, value ...int) (int, error)
++ Decrement(key string, value ...int64) (int64, error)

-- Increment(key string, value ...int) (int, error)
++ Increment(key string, value ...int64) (int64, error)

优化 Artisan 的 Call 方法

goravel/framework: v1.15.0

如果在执行过程中遇到错误,facades.Artisan().Call() 方法将会发生 panic。 现在它会返回一个错误, 所以如果你使用这个方法,请处理这个错误。

go
err := facades.Artisan().Call("command:name")

将 Testing.Database 的 Clear 方法重命名为 Shutdown

goravel/framework: v1.15.0

为了保持方法名称与其他模块一致,我们将 Clear 方法重命名为 Shutdown

go
database, err := facades.Testing().Docker().Database()
-- err := database.Clear()
++ err := database.Shutdown()

优化 Testing.Database 的 Build 方法

goravel/framework: v1.15.0

之前,调用 Build 方法时会自动执行数据库迁移。 升级后,需要手动调用 Migrate 方法来执行迁移,使数据库控制更加灵活。

go
database, err := facades.Testing().Docker().Database()
err := database.Build()
++ err := database.Migrate()

优化 Request.Input* 方法

goravel/framework: v1.15.0

goravel/gin: v1.3.0

goravel/fiber: v1.3.0

以前,Request.Input* 方法只能从 Body 获取数据,现在它会按顺序从 BodyQueryParam 中查找数据。 以前,当向 Request.Input* 方法传递第二个参数(默认值)时,如果 key 存在但为空,则会返回默认值。 现在,将返回空字符串,因为空字符串也是一个有效值,只有当 key 不存在时,才会返回默认值。

你需要检查所有使用 Request.Input* 方法的地方,以确保传递的参数正确,并且返回值符合预期。

优化 validation.PrepareForValidation 方法

goravel/framework: v1.15.0

修改输入参数类型并添加 http.Context 参数:

go
import github.com/goravel/framework/validation

-- validator, err := facades.Validation().Make(input, rules, validation.PrepareForValidation(func(data validationcontract.Data) error {
++ validator, err := facades.Validation().Make(input, rules, validation.PrepareForValidation(func(ctx http.Context, data validationcontract.Data) error {
  if name, exist := data.Get("name"); exist {
 return data.Set("name", name)
  }

  return nil
}))

优化队列模块的 Worker 方法

goravel/framework: v1.15.0

Worker 方法不需要设置参数时,可以保持为空:

go
-- facades.Queue().Worker(nil).Run()
++ facades.Queue().Worker().Run()

当需要设置参数时,参数从指针改为实例:

go
-- facades.Queue().Worker(&queue.Args{Connection: "redis").Run()
++ facades.Queue().Worker(queue.Args{Connection: "redis").Run()

Go 迁移支持布尔字段

goravel/framework: v1.15.3

go
table.Boolean("is_admin")

Go Migration 支持自定义字段

goravel/framework: v1.15.3

如果您使用的列类型框架尚不支持,您可以使用 Column 方法来自定义字段类型:

go
table.Column("geometry", "geometry")

优化 Artisan 日志输出规则

goravel/framework: v1.15.3

之前 Artisan 日志只输出错误级别的日志,现在所有级别的日志都会输出。 如果您想禁用控制台打印日志,并且使用的是 singledaily 日志驱动,请将 logging.channels.single.printlogging.channels.daily.print 配置设置为 false

修复 PrepareForValidation 中 ctx 为 nil 的问题

goravel/framework: v1.15.4

goravel/gin: v1.3.3

goravel/fiber: v1.3.3

在修复之前,PrepareForValidation 方法中的 ctx 始终为 nil,现在它将作为参数正确传递。 如果您正在使用 validation.PrepareForValidation 方法,请相应地进行修改。

go
import (
  github.com/goravel/framework/validation
  contarctsvalidate "github.com/goravel/framework/contracts/validation"
)

-- validation.PrepareForValidation(func(ctx http.Context, data contarctsvalidate.Data) error {
++ validation.PrepareForValidation(ctx, func(ctx http.Context, data contarctsvalidate.Data) error {

修复在 Fiber 驱动程序下高并发时 Orm WithContext 方法报错的问题

goravel/framework: v1.15.4

goravel/fiber: v1.3.3

详情请参阅:#866

优化打包体积

goravel/framework: v1.15.4

详情请参阅:#865

优化模型 ID 多次嵌套的问题

goravel/framework: v1.15.4

详情请参阅:#898

添加 artisan 命令别名

goravel/framework: v1.15.4

// 之前
go run  . artisan key:generate

// 之后
./artisan key:generate

修复 Throttle 在 Redis 驱动中存储失败的问题

goravel/framework: v1.15.5

goravel/redis: v1.3.1

使用 Redis 驱动时,Throttle 无法正常存储,导致限制失效。

问题:#625

修复 Fiber 驱动中 Fallback 无法正常工作的问题

goravel/framework: v1.15.5

goravel/fiber: v1.3.4

使用 Fiber 驱动时,如果设置了 Fallback,其他路由将无法正常工作。

问题:#624

修复 Orm WithContext 方法在并发执行时报错的问题

goravel/framework: v1.15.6

在使用 WithContext 方法设置 Context 时,在并发执行中会报错。

基于 MIT 许可发布