目录
概述
大型项目中,一般路由组只配置路由关系,具体业务逻辑是放在控制器里面。
抽离控制器有两种方法:
一种是直接将路由的控制器函数抽离到其他额文件,在路由中直接调用函数。但是这种方法不可以实现继承。
另一种是实现控制器的继承。
自定义控制器
定义控制器文件,路由router调用-->控制器
目录结构
project
|--main.go
|--routers(目录)
|--routerGroupInit.go
|--userRouterGroup.go
|--controllers(目录)
|--user(目录)
|--userControllers.go
自定义控制器文件--userControllers.go
package user
import (
"net/http"
"github.com/gin-gonic/gin"
)
type UserController struct{}
//getUserInfo的控制器
func (con UserController) GetUserInfo(c *gin.Context) {
username := c.Query("username")
age := c.Query("age")
c.JSON(http.StatusOK, gin.H{
"username": username,
"age": age,
})
}
//postUserAdd的控制器
func (con UserController) PostUserAdd(c *gin.Context) {
c.String(http.StatusOK, "postUserAdd-xxx")
}
路由使用自定义控制器--userRouterGroup.go
package routers
import (
"hello/controllers/user"
"github.com/gin-gonic/gin"
)
func UserRouterGroupInit(r *gin.Engine) {
userGroup := r.Group("/user")
{
userGroup.GET("/userInfo", user.UserController{}.GetUserInfo)
userGroup.POST("/userAdd", user.UserController{}.PostUserAdd)
}
}
控制器继承
定义一个含有基础功能的控制器,其他控制器继承基础功能控制器,使用其定义的基础方法。
定义基础功能控制器--baseControllers.go
package user
import (
"net/http"
"github.com/gin-gonic/gin"
)
type BaseControllers struct{}
func (con BaseControllers) Success(c *gin.Context) {
c.String(http.StatusOK, "success")
}
UserControllers继承BaseControllers,使用Success方法--userControllers.go
package user
import (
"net/http"
"github.com/gin-gonic/gin"
)
type UserController struct {
BaseControllers
}
//getUserInfo的控制器
func (con UserController) GetUserInfo(c *gin.Context) {
username := c.Query("username")
age := c.Query("age")
c.JSON(http.StatusOK, gin.H{
"username": username,
"age": age,
})
}
//postUserAdd的控制器
func (con UserController) PostUserAdd(c *gin.Context) {
//使用继承BaseControllers的Success方法
con.Success(c)
}