自定义控制器

在对路由分组后,我们对控制器也可以进行分组

首先新建controllers文件夹,然后在其中按业务逻辑创建控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
TEST
│ go.mod
│ go.sum
│ main.go

├─controllers
│ ├─admin
│ │ adminController.go
│ │
│ ├─api
│ │ apiController.go
│ │
│ └─homePage
│ homePageController.go //因为default是关键字

└─routers
adminRouters.go
apiRouters.go
defaultRouters.go

/controllers/admin/adminController.go为例,编辑控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package admin

import "github.com/gin-gonic/gin"

type AdminController struct {
}

func (c AdminController) Index(con *gin.Context) {
con.String(200, "后台首页")
}

func (c AdminController) User(con *gin.Context) {
con.String(200, "设置用户")
}

func (c AdminController) Article(con *gin.Context) {
con.String(200, "新闻列表")
}

再去到routers/adminRouters.go中重新配置路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package routers

import (
"test/controllers/admin"

"github.com/gin-gonic/gin"
)

func AdminRoutersInit(r *gin.Engine) {
//后台路由
adminRouters := r.Group("/admin")
{
adminRouters.GET("/", admin.AdminController{}.Index)
adminRouters.GET("/user", admin.AdminController{}.User)
adminRouters.GET("/article", admin.AdminController{}.Article)
}
}

注意不是admin.AdminController{}.Index(),这表示执行这个方法,而不是绑定到这个方法上

控制器的继承

上面之所以选择加一个结构体然后用它的方法,不是多此一举的,就是利用结构体的特性来继承父结构体的方法

这里定义两个全局的方法,用于返回成功和失败的消息

新建\controllers\admin\baseController.go

1
2
3
4
5
6
7
8
9
10
11
12
13
package admin

import "github.com/gin-gonic/gin"

type BaseController struct {
}

func (c BaseController) Success(con *gin.Context) {
con.String(200, "成功")
}
func (c BaseController) Error(con *gin.Context) {
con.String(200, "失败")
}

再在adminController.go中嵌套BaseController struct,并继承和调用它的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package admin

import "github.com/gin-gonic/gin"

type AdminController struct {
BaseController
}

func (c AdminController) Index(con *gin.Context) {
con.String(200, "后台首页")
}

func (c AdminController) User(con *gin.Context) {
c.Success(con)
}

func (c AdminController) Article(con *gin.Context) {
con.String(200, "新闻列表")
}

可以看见控制器已经成功继承