根据api生成代码

api定义完成后,我们通过make ctrl命令(或者gf gen ctrl)生成控制器代码。

  1. $ make ctrl
  2. generated: /Users/john/Temp/demo/api/user/user.go
  3. generated: /Users/john/Temp/demo/internal/controller/user/user.go
  4. generated: /Users/john/Temp/demo/internal/controller/user/user_new.go
  5. generated: /Users/john/Temp/demo/internal/controller/user/user_v1_create.go
  6. generated: /Users/john/Temp/demo/internal/controller/user/user_v1_update.go
  7. generated: /Users/john/Temp/demo/internal/controller/user/user_v1_delete.go
  8. generated: /Users/john/Temp/demo/internal/controller/user/user_v1_get_one.go
  9. generated: /Users/john/Temp/demo/internal/controller/user/user_v1_get_list.go
  10. done!

goframe api interface controller

生成的代码主要包含3类文件。

api接口抽象文件

定义了api interface,用于保证控制器实现的接口完整性,避免controller缺失部分接口实现的问题。由于GoFrame是一款严谨的开发框架,这种细节控制得比较好,至于该特性开发者使用与否,可以根据自身场景和需要来选择。

  1. /Users/john/Temp/demo/api/user/user.go

该文件由开发工具维护,开发者无需关心。

内容如下:

api/user/user.go

  1. // =================================================================================
  2. // Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
  3. // =================================================================================
  4. package user
  5. import (
  6. "context"
  7. "demo/api/user/v1"
  8. )
  9. type IUserV1 interface {
  10. Create(ctx context.Context, req *v1.CreateReq) (res *v1.CreateRes, err error)
  11. Update(ctx context.Context, req *v1.UpdateReq) (res *v1.UpdateRes, err error)
  12. Delete(ctx context.Context, req *v1.DeleteReq) (res *v1.DeleteRes, err error)
  13. GetOne(ctx context.Context, req *v1.GetOneReq) (res *v1.GetOneRes, err error)
  14. GetList(ctx context.Context, req *v1.GetListReq) (res *v1.GetListRes, err error)
  15. }

controller路由对象管理

用于管理控制器的初始化,以及一些控制内部使用的数据结构、常量定义。

  1. generated: /Users/john/Temp/demo/internal/controller/user/user.go
  2. generated: /Users/john/Temp/demo/internal/controller/user/user_new.go

其中internal/controller/user/user.go是一个空的源码文件,可用于定义一些控制器内部使用的数据结构、常量等内容。

internal/controller/user/user.go

  1. // =================================================================================
  2. // This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
  3. // =================================================================================
  4. package user

另一个internal/controller/user/user_new.go文件是自动生成的路由对象创建文件。

internal/controller/user/user_new.go

  1. // =================================================================================
  2. // This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
  3. // =================================================================================
  4. package user
  5. import (
  6. "demo/api/user"
  7. )
  8. type ControllerV1 struct{}
  9. func NewV1() user.IUserV1 {
  10. return &ControllerV1{}
  11. }

这两个文件都只会生成一次,随后开发者可以随意修改、扩展。

Step4 - 生成controller代码 - 图2提示

如果后续我们需要定义v2接口,make ctrl命令会类似生成type ControllerV2 struct{}结构体定义,以及func NewV2() user.IUserV2初始化方法。

controller路由实现代码

用于具体的api接口实现的代码文件。默认情况下,会按照一个api接口一个源码文件的形式生成代码。当然,也可以控制按照api文件定义的接口聚合生成到对应的一个源码文件中。具体的命令介绍及配置请参考章节 接口规范-gen ctrl

  1. generated: /Users/john/Temp/demo/internal/controller/user/user_v1_create.go
  2. generated: /Users/john/Temp/demo/internal/controller/user/user_v1_update.go
  3. generated: /Users/john/Temp/demo/internal/controller/user/user_v1_delete.go
  4. generated: /Users/john/Temp/demo/internal/controller/user/user_v1_get_one.go
  5. generated: /Users/john/Temp/demo/internal/controller/user/user_v1_get_list.go

我们打开一个文件查看生成的代码模板:

internal/controller/user/user_v1_create.go

  1. package user
  2. import (
  3. "context"
  4. "github.com/gogf/gf/v2/errors/gcode"
  5. "github.com/gogf/gf/v2/errors/gerror"
  6. "demo/api/user/v1"
  7. )
  8. func (c *ControllerV1) Create(ctx context.Context, req *v1.CreateReq) (res *v1.CreateRes, err error) {
  9. return nil, gerror.NewCode(gcode.CodeNotImplemented)
  10. }

可以看到,这只是我们定义的创建接口的实现模板,我们完善这个路由函数的具体业务逻辑即可。

学习小结

本章节的示例源码:https://github.com/gogf/quick-demo/tree/main/internal/controller/user

GoFrame脚手架工具,帮助我们将一切与业务逻辑无关的代码都生成好了,我们只需要关注业务逻辑实现即可。并且,这些自动生成的代码文件,除了开发者可以扩展的个别代码文件,大部分代码文件都完全由工具自动维护,我们也无需关心其未来的维护。

是的,GoFrame脚手架工具的目标,就是让开发者可以将精力聚焦于业务逻辑本身,而业务逻辑以外的工作,都交给开发框架和脚手架工具来完成。

这样的开发方式简直太方便了,不要太舒爽!你以为这就是全部了吗?当然不是,在快速开始章节我们只会介绍部分入门级功能。当你深入地接触她,你会发现她更多的好、她的善解人意。

下一步,我们将完成接口的业务逻辑实现,感受下GoFrame数据库ORM组件的魅力。