Skip to content

路由注册

TIP

  1. 服务端路由注册代码全部放在 internal/router 文件夹以内,其目录结构一般是对应业务控制器的目录结构。
  2. 我们也推荐您将路由注册代码规范的放置到 internal/router 以内,统一管理。

新增路由注册

我们的基控制器已经提供了 RegisterRoutes 方法,我们只需要找个地方实例化控制器、服务、仓储,然后调用一下 RegisterRoutes 就可以完成路由注册了。

如下注册管理员账号管理的路由:

go
// internal\router\admin\auth\admin.go 文件

func init() {
	registry.RegisterAdmin(func(group *gin.RouterGroup) {
		repo := repoAdmin.NewAdminRepository()
		groupRepo := repoAuth.NewAdminGroupRepository()
		svc := svcAuth.NewAuthAdminService(repo, groupRepo)
		h := handlerAuth.NewAuthAdminHandler(svc)

		subGroup := group.Group("/auth/admin")
		h.RegisterRoutes(subGroup)
	})
}

根据 Go 的机制,包的 init() 函数会在包被导入后自动执行,也就是说我们还需要在 internal\router\router.go 里边空白导入一下以上包,以便触发 init()

新增路由注册,只需要参考以上代码照葫芦画瓢,或者 router 目录还有很多其他参考可用;如果是后台可视化CRUD生成的代码,也会自动生成路由注册的逻辑;

路由注册实现

路由收集辅助函数

我们定义了两个收集路由的辅助函数:

registry.Register

专门用来 收集前台路由注册函数 的函数,它会将所有 前台路由注册函数 收集起来。

说起来复杂,其实就是:

go
var Routes []func(*gin.Engine)

func Register(fn func(*gin.Engine)) {
	Routes = append(Routes, fn)
}

registry.RegisterAdmin

registry.Register 的后台版本,是专门用来 收集后台路由注册函数 的函数。

路由集中注册

我们在 router.Setup 方法内统一完成了前后台路由注册(说白了就是将以上两个函数收集到的 路由注册函数 遍历调用):

go
// Setup 遍历所有已注册的路由模块,传入 Engine 完成注册
func Setup(r *gin.Engine) {
	for _, fn := range registry.Routes {
		fn(r)
	}

	// 后台路由分组
    // config.Get().Server.AdminBaseRoutePath 的值默认是 /admin
	adminGroup := r.Group(config.Get().Server.AdminBaseRoutePath)

	// 注册管理员操作日志中间件
	adminGroup.Use(middleware.AdminLog())

	// 注册全部后台路由
	for _, fn := range registry.AdminRoutes {
		fn(adminGroup)
	}
}

TIP

以上 router.Setup 函数,是在 cmd\serve\serve.goRun 方法,也就是启动服务的方法中调用的,这样就是完成了系统所有路由的注册。