Controller
controller就是處理具體的邏輯的,router將請求分發到指定的controlller,controller處理請求,然后返回。
基於beego的Controller 設計,只需要匿名組合beego.Controller就可以了,如下所示:
type xxxController struct {
beego.Controller
}
beego.Controller擁有很多方法,其中包括Init、Prepare、 Post、 Get、Delete、 Head等方法。我們可以通過重寫的方式來實現這些方法。
一、默認的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"] = "astaxie@gmail.com" c.TplName = "index.tpl" }
里面就有MainController,並且重寫了Get()方法。
說明:
我們可以通過各種方式獲取數據,然后賦值到this.Data中,這是一個用來存儲輸出數據的map,可以賦值任意類型的值,這里我們只是簡單舉例輸出兩個字符串。
最后一個就是需要去渲染的模板,this.TplName 就是需要渲染的模板,這里指定了index.tpl,如果用戶不設置該參數,那么默認會去到模板目錄的Controller/<方法名>.tpl查找,例如上面的方法會去maincontroller/get.tpl(文件、 文件夾必須小寫)。 用戶設置了模板之后系統會自動的調用Render函數(這個函數是在beego.Contoller中實現的),所以無需用戶自己來調用渲染。
1.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.2 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,可以賦值任意類型的值,這里我們只是簡單舉例輸出字符串。