1. 程式人生 > 其它 >(五)Beego控制器之控制器函式

(五)Beego控制器之控制器函式

控制器函式指的是處理使用者請求的函式,前面路由設定章節介紹過,beego框架支援兩種處理使用者請求的函式。

  • beego.FilterFunc型別的獨立函式
  • 控制器函式(RESTful風格實現,beego預設推薦的格式)

一、beego.FilterFunc函式

這是最簡單的請求處理函式,函式原型定義:

type FilterFunc func(*context.Context)

也就是隻要定義一個函式,並且接收一個Context引數,那麼這個函式就可以作為處理使用者請求的函式。
例子:

func DoLogin(ctx *context.Context) {
     // ..處理請求的邏輯...
     // 可以通過Context 獲取請求引數,返回請求結果
}

有了處理函式,我們就可以將處理函式跟一個url路由繫結起來.
例子:

web.Get("/user/login", DoLogin)
提示: 新版的beego設計,預設不推薦使用beego.FilterFunc函式方式,這種方式處理請求的方式比較原始,後面介紹的控制器函式擁有更多高階特性,後續的教程以控制器函式為主。

二、控制器函式

控制器函式是beego的RESTful api的實現方式,在beego的設計中,控制器就是一個嵌套了beego.Controller的結構體物件。
例子:

// 定義一個新的控制器
type UserController struct {
    // 巢狀beego基礎控制器
    web.Controller
}

前面介紹過,struct巢狀,就類似其他高階語言的 繼承 特性,嵌套了web.Controller控制器,就擁有了web.Controller定義的屬性和函式。

控制器命名規則約定:XxxController
Xxx就是我們的控制器名字, 這是為了便於閱讀,看到Controller結尾的struct就知道是一個控制器。

下面看一個完整控制器的例子:

type UserController struct {
    // 巢狀beego基礎控制器
    web.Controller
}

// 在呼叫其他控制器函式之前,會優先呼叫Prepare函式
func (this *UserController) Prepare() {
    // 這裡可以跑一些初始化工作
}

// 處理get請求
func (this *UserController) Get() {
    // 處理邏輯
}

// 處理post請求
func (this *UserController) Post() {
    // 處理邏輯
}

註冊路由

// 在這裡引數:id是可選的
web.Router("/user/?:id", &controllers.UserController{})

根據上面註冊的路由規則, 下面的展示對應的http請求和處理函式:

  • GET /user/2 - 由Get函式處理
  • POST /user - 由Post函式處理
提示:前面路由設定章節介紹過控制器的路由規則是Get請求由Get函式處理,Post請求由Post函式處理,以此類推。

下表展示了web.Controller預設為我們提供了哪些可選的函式:

提示: 根據業務需要,控制器可以覆蓋下表中的函式。
函式名 說明
Prepare() 這個函式會優先執行,才會執行Get、Post之類的函式, 可以在Prepare做一些初始化工作。
Get() 處理get請求, 如果沒有實現該函式,預設會返回405錯誤。
Post() 處理Post請求, 預設會返回405錯誤。
Delete() 處理Delete請求, 預設會返回405錯誤。
Put() 處理PUT請求, 預設會返回405錯誤。
Finish() 執行完Get、Post之類http請求函式之後執行,我們可以在Finish函式處理一些回收工作。

三、如何提前結束請求

如果我們在Prepare函式處理使用者的許可權驗證,驗證不通過,我們一般都希望結束請求,不要執行後面的函式,beego提供了StopRun函式來結束請求。
例子:

func (this *UserController) Prepare() {
    // 處理許可權驗證邏輯

    // 驗證不通過,返回錯誤資訊,結束請求
    this.Data["json"] = map[string]interface{}{"error":"沒有許可權", "errno":401}
	this.ServeJSON()
    this.StopRun()
}
提示:呼叫 StopRun 之後,不會再執行Finish函式,如果有需要可以在呼叫StopRun之後,手動呼叫Finish函式。