Revel 概念

2020-02-07 14:39 更新

Revel 從Rails 和 Play! 中吸收了許多成熟的設(shè)計(jì)思想, 許多相同的思想被用到了框架的設(shè)計(jì)和接口中。

Revel 通過(guò)簡(jiǎn)單的約定來(lái)支持 MVC 設(shè)計(jì)模式,輕量、開(kāi)發(fā)效率高。

MVC

  • 模型 描述基本的數(shù)據(jù)對(duì)象,特定的查詢和更新邏輯。
  • 視圖 一些模板,用于將數(shù)據(jù)呈現(xiàn)給用戶。
  • 控制器 執(zhí)行用戶的請(qǐng)求,準(zhǔn)備用戶所需的數(shù)據(jù),并指定模板進(jìn)行渲染。

一些不錯(cuò)的MVC結(jié)構(gòu)概述,像 Play! 框架 與Revel框架完全匹配。

請(qǐng)求的生命周期

下面是一個(gè)請(qǐng)求處理的基本流程:

概要:

  • Revel 暴漏一個(gè)單獨(dú)的 http.Handler, 負(fù)責(zé)實(shí)例化控制器 (請(qǐng)求的上下文),并沿著過(guò)濾器鏈傳遞請(qǐng)求。
  • Filters 鏈接到一個(gè)請(qǐng)求處理鏈,由水平相關(guān)的功能組成,比如請(qǐng)求記錄,cookie策略,授權(quán)等。大部分內(nèi)建功能都是由過(guò)濾器實(shí)現(xiàn)的。
  • Actions 是處理用戶輸入和產(chǎn)生請(qǐng)求結(jié)果的的函數(shù)。

HTTP Handler

Revel 構(gòu)建自頂級(jí) Go HTTP server, 他為每一個(gè)到來(lái)的請(qǐng)求創(chuàng)建一個(gè) go-routine (輕量線程),用于處理并發(fā)。

Revel什么也不做,只是把請(qǐng)求交給過(guò)濾器鏈處理,完成之后,將結(jié)果寫到響應(yīng)中。

默認(rèn)情況下, Revel 處理程序注冊(cè)到 "/" 接受所有的請(qǐng)求連接。然而, 應(yīng)用程序可以自由的重寫此行為 – 例如, 可以使用現(xiàn)有的 http.Handlers 而不是Revel來(lái)重新實(shí)現(xiàn)此功能。具體請(qǐng)參考 FAQ。

過(guò)濾器

過(guò)濾器 實(shí)現(xiàn)了Revel的大部分請(qǐng)求處理功能,過(guò)濾器有一個(gè)簡(jiǎn)單的易于嵌套的接口。

“過(guò)濾器鏈” 是一個(gè)函數(shù)數(shù)組, 每一個(gè)都會(huì)去執(zhí)行下一個(gè),直到最后一個(gè)過(guò)濾器執(zhí)行了控制器方法。例如, 過(guò)濾器鏈中的第一個(gè)過(guò)濾器是 RouterFilter, 它決定哪個(gè)操作接受請(qǐng)求并保存到控制器。

總之, 過(guò)濾器和過(guò)濾器鏈就像機(jī)架一樣。

控制器和方法

每一個(gè) HTTP 請(qǐng)求,執(zhí)行一個(gè) action, 處理請(qǐng)求并寫入響應(yīng)。 相關(guān)的 actions 被分組到 controllers中. Controller 類型包含相關(guān)字段和方法,作為每個(gè)請(qǐng)求的上下文。

作為 HTTP 請(qǐng)求處理的一部分,Revel 實(shí)例化你的控制器,并設(shè)置嵌入revel.Controller的所有的屬性。 Revel 不在請(qǐng)求之間共享實(shí)例。


Controller 是直接 或 間接嵌入 *revel.Controller 的一個(gè)struct。

type AppController struct {
  *revel.Controller
}

Action 是 Controller 的方法。符合下面的條件:

  • 名稱是導(dǎo)出的(首字母大寫)
  • 返回 revel.Result 類型

例如:

func (c AppController) ShowLogin(username string) revel.Result {
    ..
    return c.Render(username)
}

程序調(diào)用 revel.Controller.Render 渲染一個(gè)模板, 傳遞給模板一個(gè)username參數(shù)。revel.Controller 有許多方法處理revel.Result, 程序也可以自己創(chuàng)建處理方法。

Results

Result 符合下面的接口:

type Result interface {
    Apply(req *Request, resp *Response)
}

通常, 什么也不響應(yīng),直到 action 和所有的過(guò)濾器返回。此時(shí),Revel寫入響應(yīng)的headers和cookies。(例如設(shè)置會(huì)話cookie), 然后調(diào)用 Result.Apply 寫入實(shí)際響應(yīng)內(nèi)容。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)