我试图通过路由器传递一个在main.go内初始化的记录器引用到Controller层
main.go
logger, _ := zap.NewProduction()
defer logger.Sync() // flushes buffer, if any
sugar := logger.Sugar()
routers.Init(sugar)
routers.go
func Init(l *zap.SugaredLogger) {
nsMgt := beego.NewNamespace("/api",
beego.NSNamespace("/account",
beego.NSInclude(
&controllers.AccountController{
Logger: l,
},
),
),
)
)
controller.go
type AccountController struct {
beego.Controller
Logger *zap.SugaredLogger
}
// @Title Get account details.
// @Summary Get account details
// @Param filterKey query string true "possible values 'id' or 'username'"
// @Param filterValue query string true "value of the filter key"
// @Success 200 {object} models.User
// @router / [get]
func (o *AccountController) Get() {
o.Logger.Info("this is cool")
}
它在控制器函数处抛出空指针错误。有没有办法将全局记录器变量传递给控制器层?在主要功能初始化记录器是很重要的,因为它需要延迟关闭。
答案 0 :(得分:0)
Beego使用反射为每个请求创建一个控制器实例,它不会使用您传入的实际实例,也不会将参数传递给新实例。您可以定义"准备"你的控制器上的方法将在调用匹配的控制器方法之前由Beego在运行时调用,你可以通过调用工厂方法或某种IoC容器来初始化所需的结构字段(例如服务层)(不确定这是否是Go的最佳实践
我还在初始化结构时寻找了传递依赖关系的选项,但目前还不可能。
查看请求处理逻辑:https://beego.me/docs/mvc/
准备方法记录在这里: https://beego.me/docs/mvc/controller/controller.md