go-zero(五) 模板定制
go-zero 模板定制
goctl 代码生成是基于 go 的模板去实现数据驱动的,实际开发中,使用goctl
生成的代码,并不符合我们的需求。
例如,我们刚刚的使用错误管理,我们需要在handler中返回的错误信息。
一、生成模板
首先,我们需要初始化模板文件。通过运行goctl template init
命令,可以将模板文件下载到本地。
sql2pb>goctl template init -home ./
- home 是存储模板的路径
执行命令后,指定目录中会生成以下文件和文件夹结构:
├─api
├─docker
├─gateway
├─kube
├─model
├─mongo
├─newapi
└─rpc
这些目录对应了go-zero中不同模块的模板,提供了服务生成的基本结构。
二、修改模板
这里我们演示如何修改handler.tpl
模板,以便在处理请求时返回更合适的错误信息。
打开handler.tpl
文件,可以看到生成的代码框架。我们将在处理请求时引入新的错误处理逻辑,使其更符合业务需求。以下是修改后的模板代码:
package {{.PkgName}}
import (
"net/http"
xhttp "github.com/zeromicro/x/http" //导入zeromicro库
"github.com/zeromicro/go-zero/rest/httpx"
{{.ImportPackages}}
)
{{if .HasDoc}}{{.Doc}}{{end}}
func {{.HandlerName}}(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
{{if .HasRequest}}var req types.{{.RequestType}}
if err := httpx.Parse(r, &req); err != nil {
//httpx.ErrorCtx(r.Context(), w, err)
xhttp.JsonBaseResponseCtx(r.Context(), w, err)
return
}
{{end}}l := {{.LogicName}}.New{{.LogicType}}(r.Context(), svcCtx)
{{if .HasResp}}resp, {{end}}err := l.{{.Call}}({{if .HasRequest}}&req{{end}})
if err != nil {
//httpx.ErrorCtx(r.Context(), w, err)
xhttp.JsonBaseResponseCtx(r.Context(), w, err)
} else {
{{if .HasResp}}xhttp.JsonBaseResponseCtx(r.Context(), w, resp){{else}}httpx.Ok(w){{end}}
}
}
}
修改说明
- 我们使用了 xhttp.JsonBaseResponseCtx 方法来返回错误信息,这样可以确保客户端得到统一风格的错误响应。
- 处理请求的逻辑保留了原有结构,但在错误处理的方式上作了调整,以更好地符合业务需求。
自定义规则:
- 在 goctl 提供的有效数据范围内修改,即不支持外部变量
- 不支持新增模板文件
- 不支持变量修改
三、根据模板生成代码
完成模板的修改后,可以使用 goctl
命令来生成新代码。以下是命令示例:
goctl api go --api user.api --dir ./ --home ../sql2pb
--home
指定我们刚刚下载的模板路径, 默认值为 ${HOME}/.goctl
在代码生成完成后,我们可以查看生成的 handler 文件,以确认我们的修改是否成功。新的 handler 文件应当能够根据我们自定义的模板返回整洁的错误响应。