Go语言之高级篇beego框架之Controller

一、Controller 控制器

Controller等同于Django里的view,处理逻辑都是在Controller里面完成的,下面就写一个最简单的Controller。

写controller的时候,一定要继承beego.Controller,也一定要记得导入 github.com/astaxie/beego.

1、 基于 beego 的 Controller 设计,只需要匿名组合 beego.Controller。

示例1: 语法

type xxxController struct {
    beego.Controller
}

示例2: 使用方法

package controllers

import (
        "github.com/astaxie/beego"
)

type MainController struct {
        beego.Controller
}

func (this *MainController) Get() {
        this.Data["Website"] = "beego.me"
        this.Data["Email"] = "astaxie@gmail.com"
        this.TplName = "index.tpl"
}

  

3、Controller用法介绍

beego.Controller 拥有很多方法,其中包括 Init、Prepare、Post、Get、Delete、Head等 方法。我们可以通过重写的方式来实现这些方法,而我们上面的代码就是重写了 Get 方法。
我们可以通过各种方式获取数据,然后赋值到 this.Data 中,这是一个用来存储输出数据的 map,可以赋值任意类型的值,这里我们只是简单举例输出两个字符串。
最后一个就是需要去渲染的模板,this.TplName 就是需要渲染的模板,这里指定了 index.tpl,如果用户不设置该参数,那么默认会去到模板目录的 Controller/<方法名>.tpl 查找,例如上面的方法会去 maincontroller/get.tpl(文件、文件夹必须小写)。
用户设置了模板之后系统会自动的调用 Render 函数(这个函数是在 beego.Controller 中实现的),所以无需用户自己来调用渲染。

示例: 当然也可以不使用模版,直接用 this.Ctx.WriteString 输出字符串

func (this *MainController) Get() {
        this.Ctx.WriteString("hello")
}

  

4、beego.Controller源码解读

示例:

type Controller struct {
    // context data
    Ctx  *context.Context
    Data map[interface{}]interface{}

    // route controller info
    controllerName string
    actionName     string
    methodMapping  map[string]func() //method:routertree
    gotofunc       string
    AppController  interface{}

    // template data
    TplName        string
    ViewPath       string
    Layout         string
    LayoutSections map[string]string // the key is the section name and the value is the template name
    TplPrefix      string
    TplExt         string
    EnableRender   bool

    // xsrf data
    _xsrfToken string
    XSRFExpire int
    EnableXSRF bool

    // session
    CruSession session.Store
}

// ControllerInterface is an interface to uniform all controller handler.
type ControllerInterface interface {
    Init(ct *context.Context, controllerName, actionName string, app interface{})
    Prepare()
    Get()
    Post()
    Delete()
    Put()
    Head()
    Patch()
    Options()
    Finish()
    Render() error
    XSRFToken() string
    CheckXSRFCookie() bool
    HandlerFunc(fn string) bool
    URLMapping()
}

beego.Controller 实现了接口beego.ControllerInterface,beego.ControllerInterface 定义了如下函数:

Init(ct *context.Context, childName string, app interface{})

这个函数主要初始化了 Context、相应的 Controller 名称,模板名,初始化模板参数的容器 Data,app 即为当前执行的 Controller 的 reflecttype,这个 app 可以用来执行子类的方法。

Prepare()

这个函数主要是为了用户扩展用的,这个函数会在下面定义的这些 Method 方法之前执行,用户可以重写这个函数实现类似用户验证之类。

Get()

如果用户请求的 HTTP Method 是 GET,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Get 请求。

Post()

如果用户请求的 HTTP Method 是 POST,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Post 请求。

Delete()

如果用户请求的 HTTP Method 是 DELETE,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Delete 请求。

Put()

如果用户请求的 HTTP Method 是 PUT,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Put 请求.

Head()

如果用户请求的 HTTP Method 是 HEAD,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Head 请求。

Patch()

如果用户请求的 HTTP Method 是 PATCH,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Patch 请求.

Options()

如果用户请求的HTTP Method是OPTIONS,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Options 请求。

Finish()

这个函数是在执行完相应的 HTTP Method 方法之后执行的,默认是空,用户可以在子 struct 中重写这个函数,执行例如数据库关闭,清理数据之类的工作。

Render() error

这个函数主要用来实现渲染模板,如果 beego.AutoRender 为 true 的情况下才会执行。