Goframe学习笔记(三)Controller & Service

本文介绍了如何在GoFrame框架中组织Controller层和API文件夹结构,包括创建版本控制的API目录、定义请求和响应结构体,以及利用gen工具自动生成Controller代码。同时详细讲解了Service层和服务接口的实现和注册过程。
摘要由CSDN通过智能技术生成

Controller层

涉及文件夹 :internal 下的 controller 文件夹和 api 文件夹

api 文件夹

api 文件夹下创建 hi/v1文件夹,并在 v1 文件夹下创建v1文件夹,v_指的是该api的版本号

目录结构如下:

├── api
│   ├── hi
│   │   ├── v1
│   │   │   ├── hi.go

在hi.go中添加需要的请求结构体和响应结构体,命名与规范路由的写法一致,请求以Req结尾,响应以Res结尾。注:首字母需要大写,不然其他包访问不了会爆红。

package v1
​
import "github.com/gogf/gf/v2/frame/g"
​
type HiReq struct {
    g.Meta `path:"/hi" method:"get"`
}
​
type HiRes struct {
    Msg string
}

controller文件夹

api 中写入请求结构体与响应结构体后,可以用 GoFrame 框架的代码生成工具 gen 快速生成 controller 文件。

在终端中输入指令

gf gen ctrl

4aca72ee767f4162b9646e30ce13337f.png

可以看到生成了四个文件。

进入 hi_v1_hi.go 文件, 在方法中添加具体实现的代码

package hi
​
import (
    "context"
​
    "demo/api/hi/v1"
)
​
func (c *ControllerV1) Hi(ctx context.Context, req *v1.HiReq) (res *v1.HiRes, err error) {
    res = &v1.HiRes{
        "hi",
    }
    return
}

自动生成的 hi_new.go 文件含有获取接口实现的函数,可以在 cmd.go 中进行路由注册

// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// =================================================================================
​
package hi
​
import (
    "demo/api/hi"
)
​
type ControllerV1 struct{}
​
func NewV1() hi.IHiV1 {
    return &ControllerV1{}
}

示例:

Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
            s := g.Server()
            s.Use(ghttp.MiddlewareHandlerResponse)
            s.Group("/", func(group *ghttp.RouterGroup) {
                group.Bind(
                    hi.NewV1(),
                )
            })
            s.Run()
            return nil
        },

运行后可以访问127.0.0.1:8000/hi看到响应结果:

d93900e9d0e14e6a87054df956643ab2.png

Server层

涉及文件夹: internal下的 servicelogic 文件夹

Service 文件夹

  • 创建 example.go 文件

package service
​
import ...
​
// 1. 定义接口
​
type IExample interface {
  Function(...) 
}
​
// 2.定义接口变量
​
var localExample *IExample
​
// 3.定义获取接口实例函数
​
func Example() *IExample {
​
  if local_ == nil {
     panic("Example interface unrealized")
  }
    
  return localExample // 返回接口变量
}
// 4.定义接口实现注册方法
​
func RegisterExample(i *IExample) {
  localExample = i
}

Logic 文件夹

Logic 文件夹下创建 logic.go 文件

package logic

import(
	_ "example_object/internal/logic/example" //初始化接口实现包
)

main.go 初始化 logic

import _ "union_demo/internal/logic

创建 example 文件夹,并在文件夹下创建 example.go

package example
​
import ...
​
// 注册接口
func init() {
    service.RegisterExample(&sExample{})
}
​
type sExample struct{}
​
// 具体实现
func (* sExample)Function(...){
    ......
}
最后通过接口的获取函数Example()获取接口变量进行方法调用。
​

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值