小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
默认的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中实现的),所以无需用户自己来调用渲染。
- 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
- 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,可以赋值任意类型的值,这里我们只是简单举例输出字符串。