将全局参考传递给beego控制器

时间:2017-08-01 09:56:25

标签: go beego

我试图通过路由器传递一个在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")
}

它在控制器函数处抛出空指针错误。有没有办法将全局记录器变量传递给控制器​​层?在主要功能初始化记录器是很重要的,因为它需要延迟关闭。

1 个答案:

答案 0 :(得分:0)

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

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

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

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