Beego脱坑(四)Controller


title: Beego脱坑(四)Controller

tags: go,beego

author : Clown95


Controller的内容比较简单,如果阅读过我前面的几篇文章,应该对Controller有了一个基础的了解。Controller作用就是Router把用户的请求分发到Controller,Controller在根据相应的方法进行处理。

现在我们就来看看Controller是怎么写的,控制器只需要匿名组合 beego.Controller 就可以了,并且名字都是以xxxController命名,如下所示:

type xxxController struct {
    beego.Controller
}

接着我们来看一个实例:


type HelloController struct {
	beego.Controller
}
 
func (hello * HelloController) Get() {
	hello.Ctx.WriteString("hello world")
}

在这是实例中,我们创建了一个名为 HelloController 的控制器,并且重写了beego.Controller 的Get方法,通过Get方法向浏览器输出 hello world 。

通过 type ControllerInterface interface ,我们可以知道 Get只是 beego.Controller 方法的其中之一,它还包括包括 Init、Prepare、Post、Get、Delete、Head 等方法。

beego 是一个 RESTful 的框架,所以我们的请求默认是执行对应 req.Method 的方法。例如浏览器的是 GET 请求,那么默认就会执行 HelloController 下的 Get 方法。

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()  
}

如果你还看过 Controller的结构体,那么你应该能够清楚的看到它一共有5大块:

1.上下文数据

2.路由控制信息

3.模板(View)数据

4.跨站域请求伪造 数据

5.Session

上下文数据其实我们一直在使用,  Ctx  *context.Context 就是上下文数据中的内容,至于其他部分我们留在以后再说。

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
	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
}

 

你可能感兴趣的:(#,beego,go)