控制器开发

XYGo Admin 2025-02-20 94 次阅读

Controller 层编写规范与最佳实践

控制器开发

职责定义

Controller 层只负责:

  1. 接收请求参数(由框架自动绑定)
  2. 调用 Service 层处理业务
  3. 返回响应结果

不要在 Controller 中编写业务逻辑。

编写规范

1. 定义 API 结构体

api/admin/ 目录下定义请求和响应:

go 复制代码
// api/admin/admin_example.go
package admin

import "github.com/gogf/gf/v2/frame/g"

// 列表
type ExampleListReq struct {
    g.Meta   `path:"/example/list" method:"get" tags:"示例管理" summary:"列表"`
    Page     int    `json:"page" d:"1"`
    PageSize int    `json:"pageSize" d:"20"`
    Title    string `json:"title"`
}
type ExampleListRes struct {
    List  interface{} `json:"list"`
    Total int         `json:"total"`
}

// 编辑(新增+修改)
type ExampleEditReq struct {
    g.Meta `path:"/example/edit" method:"post" tags:"示例管理" summary:"编辑"`
    Id     uint64 `json:"id"`
    Title  string `json:"title" v:"required#请输入标题"`
    Status int    `json:"status" d:"1"`
}
type ExampleEditRes struct{}

// 删除
type ExampleDeleteReq struct {
    g.Meta `path:"/example/delete" method:"post" tags:"示例管理" summary:"删除"`
    Id     uint64 `json:"id" v:"required#请选择要删除的数据"`
}
type ExampleDeleteRes struct{}

2. 编写 Controller

go 复制代码
// internal/controller/admin/example.go
package admin

import (
    "context"
    api "xygo/api/admin"
    "xygo/internal/service"
)

var Example = cExample{}
type cExample struct{}

func (c *cExample) List(ctx context.Context, req *api.ExampleListReq) (res *api.ExampleListRes, err error) {
    return service.Example().List(ctx, req)
}

func (c *cExample) Edit(ctx context.Context, req *api.ExampleEditReq) (res *api.ExampleEditRes, err error) {
    return service.Example().Edit(ctx, req)
}

func (c *cExample) Delete(ctx context.Context, req *api.ExampleDeleteReq) (res *api.ExampleDeleteRes, err error) {
    return service.Example().Delete(ctx, req)
}

3. 注册路由

internal/cmd/cmd.go 中将 Controller 注册到路由组:

go 复制代码
// /admin 路由组
group.Group("/admin", func(group *ghttp.RouterGroup) {
    group.Middleware(middleware.AdminAuth)
    group.Bind(
        controller.Admin.Example,
        // ... 其他控制器
    )
})