golang中web框架-beego中默认的Controller

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

默认的Controller

对于我们默认生成的beego的项目中,default.go文件:

package controllers
​
import (
    "github.com/astaxie/beego"
)
​
type MainController struct {
    beego.Controller
}
​
func (c *MainController) Get() {
    c.Data["Website"] = "beego.me"
    c.Data["Email"] = "[email protected]"
    c.TplName = "index.tpl"
}
复制代码

里面就有MainController,并且重写了Get()方法。

说明:

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

  1. Controller结构体

首先我们来看看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
}
复制代码

从controller的结构体我们可以看到,一共有5大块:

1.上下文数据

2.路由控制信息

3.模板数据

4.xsrf数据

5.session

  1. ControllerInterface
type ControllerInterface interface {
​
    Init(ct *context.Context, controllerName, actionName string, app interface{})
    /*
    主要用来初始化Context、 Controller 名称,模板名,
    初始化模板参数的容器 Data, app 可以用来执行子类的方法
    */
​
    Prepare()
    /*
    这个函数主要是为了用户扩展用的,这个函数会在下面定义的这些 Method 方法之前执行,
    用户可以重写这个函数实现类似用户验证之类。
    */
​
    Get()//如果用户请求的 HTTP Method 是 GET,那么就执行该函数
​
    Post()//如果用户请求的 HTTP Method 是 POST,那么就执行该函数
​
    Delete()// 如果用户请求的 HTTP Method 是 DELETE,那么就执行该函数
​
    Put()//如果用户请求的 HTTP Method 是 PUT,那么就执行该函数
​
    Head()//如果用户请求的 HTTP Method 是 HEAD,那么就执行该函数
​
    Patch()//如果用户请求的 HTTP Method 是 PATCH,那么就执行该函数
​
    Options()//如果用户请求的HTTP Method是OPTIONS,那么就执行该函数
​
    Finish()
    /*
    这个函数是在执行完相应的 HTTP Method 方法之后执行的,默认是空,用户可以在子 struct 中重写这        
    个函数,执行例如数据库关闭,清理数据之类的工作。
    */
​
    Render() error  
    //这个函数主要用来实现渲染模板,如果 beego.AutoRender 为 true 的情况下才会执行。
​
    XSRFToken() string
​
    CheckXSRFCookie() bool
​
    HandlerFunc(fn string) bool
​
    URLMapping()
}
复制代码

从ControllerInterface 我们可以看到Controller 拥有很多方法,其中包括 Init、Prepare、Post、Get、Delete、Head 等方法。我们可以通过重写的方式来实现这些方法,而我们上面的代码就是重写了 Get 方法。

beego 是一个 RESTful 的框架,所以我们的请求默认是执行对应 req.Method 的方法。例如浏览器的是 GET 请求,那么默认就会执行 HelloControllers 下的 Get 方法。这样我们上面的 Get 方法就会被执行到,这里只是调用Controller.Ctx.WriteString()然后赋值到Controller.Data中,这是一个用来存储输出数据的 map,可以赋值任意类型的值,这里我们只是简单举例输出字符串。

猜你喜欢

转载自juejin.im/post/7018826576783474718

相关文章