传递对 beego 控制器的全局引用



我正在尝试通过路由器将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,
},
),
),
)
)

控制器.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")
}

它会在控制器函数上引发空指针错误。有没有办法将全局记录器变量传递给控制器层?在主函数中初始化记录器很重要,因为它需要延迟关闭。

Beego 使用反射为每个请求创建一个控制器实例,它不使用您传入的实际实例,也不会将参数传递给新实例。您可以在控制器上定义"Prepare"方法,该方法将在运行时由 Beego 调用,然后再调用匹配的控制器方法,在那里您可以通过调用工厂方法或某种 IoC 容器来初始化所需的结构字段(例如服务层((不确定这是否是 Go 的最佳实践(

我还在寻找在初始化结构时传递依赖项的选项,但目前不可能。

查看请求处理逻辑:https://beego.me/docs/mvc/

准备方法记录在此处: https://beego.me/docs/mvc/controller/controller.md

最新更新