跳到主要内容
版本:2.8.x(Latest)

根据api生成代码

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

$ make ctrl
generated: /Users/john/Temp/demo/api/user/user.go
generated: /Users/john/Temp/demo/internal/controller/user/user.go
generated: /Users/john/Temp/demo/internal/controller/user/user_new.go
generated: /Users/john/Temp/demo/internal/controller/user/user_v1_create.go
generated: /Users/john/Temp/demo/internal/controller/user/user_v1_update.go
generated: /Users/john/Temp/demo/internal/controller/user/user_v1_delete.go
generated: /Users/john/Temp/demo/internal/controller/user/user_v1_get_one.go
generated: /Users/john/Temp/demo/internal/controller/user/user_v1_get_list.go
done!

goframe api interface controller

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

api接口抽象文件

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

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

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

内容如下:

api/user/user.go
// =================================================================================
// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
// =================================================================================

package user

import (
"context"

"demo/api/user/v1"
)

type IUserV1 interface {
Create(ctx context.Context, req *v1.CreateReq) (res *v1.CreateRes, err error)
Update(ctx context.Context, req *v1.UpdateReq) (res *v1.UpdateRes, err error)
Delete(ctx context.Context, req *v1.DeleteReq) (res *v1.DeleteRes, err error)
GetOne(ctx context.Context, req *v1.GetOneReq) (res *v1.GetOneRes, err error)
GetList(ctx context.Context, req *v1.GetListReq) (res *v1.GetListRes, err error)
}

controller路由对象管理

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

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

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

internal/controller/user/user.go
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// =================================================================================

package user

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

internal/controller/user/user_new.go
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// =================================================================================

package user

import (
"demo/api/user"
)

type ControllerV1 struct{}

func NewV1() user.IUserV1 {
return &ControllerV1{}
}

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

提示

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

controller路由实现代码

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

generated: /Users/john/Temp/demo/internal/controller/user/user_v1_create.go
generated: /Users/john/Temp/demo/internal/controller/user/user_v1_update.go
generated: /Users/john/Temp/demo/internal/controller/user/user_v1_delete.go
generated: /Users/john/Temp/demo/internal/controller/user/user_v1_get_one.go
generated: /Users/john/Temp/demo/internal/controller/user/user_v1_get_list.go

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

internal/controller/user/user_v1_create.go
package user

import (
"context"

"github.com/gogf/gf/v2/errors/gcode"
"github.com/gogf/gf/v2/errors/gerror"

"demo/api/user/v1"
)

func (c *ControllerV1) Create(ctx context.Context, req *v1.CreateReq) (res *v1.CreateRes, err error) {
return nil, gerror.NewCode(gcode.CodeNotImplemented)
}

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

学习小结

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

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

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

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

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