【GoWeb開發實戰】Beego之Controller使用


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,可以賦值任意類型的值,這里我們只是簡單舉例輸出字符串。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM