🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
Revel 从Rails 和 Play! 中吸收了许多成熟的设计思想, 许多相同的思想被用到了框架的设计和接口中。 Revel 通过简单的约定来支持 MVC 设计模式,轻量、开发效率高。 ## MVC * *模型* 描述基本的数据对象,特定的查询和更新逻辑。 * *视图* 一些模板,用于将数据呈现给用户。 * *控制器* 执行用户的请求,准备用户所需的数据,并指定模板进行渲染。 一些不错的MVC结构概述,像 [Play! 框架](http://www.playframework.org/) 与Revel框架完全匹配。 ## 请求的生命周期 下面是一个请求处理的基本流程: ![](https://box.kancloud.cn/2015-10-20_5625fbf9aa069.png) 概要: * Revel 暴漏一个单独的 http.Handler, 负责实例化控制器 (请求的上下文),并沿着过滤器链传递请求。 * Filters 链接到一个请求处理链,由水平相关的功能组成,比如请求记录,cookie策略,授权等。大部分内建功能都是由过滤器实现的。 * Actions 是处理用户输入和产生请求结果的的函数。 ## HTTP Handler Revel 构建自顶级 Go HTTP server, 他为每一个到来的请求创建一个 go-routine (轻量线程),用于处理并发。 Revel什么也不做,只是把请求交给过滤器链处理,完成之后,将结果写到响应中。 默认情况下, Revel 处理程序注册到 `"/"` 接受所有的请求连接。然而, 应用程序可以自由的重写此行为 – 例如, 可以使用现有的 http.Handlers 而不是Revel来重新实现此功能。具体请参考 [FAQ](http://gorevel.cn/docs/manual/faq.html)。 ## 过滤器 [过滤器](http://gorevel.cn/docs/manual/filters.html) 实现了Revel的大部分请求处理功能,过滤器有一个简单的易于嵌套的接口。 “过滤器链” 是一个函数数组, 每一个都会去执行下一个,直到最后一个过滤器执行了控制器方法。例如, 过滤器链中的第一个过滤器是 `RouterFilter`, 它决定哪个操作接受请求并保存到控制器。 总之, 过滤器和过滤器链就像机架一样。 ## 控制器和方法 每一个 HTTP 请求,执行一个 **action**, 处理请求并写入响应。 相关的 **actions** 被分组到 **controllers**中. [Controller](http://gorevel.cn/docs/docs/godoc/controller.html#Controller) 类型包含相关字段和方法,作为每个请求的上下文。 作为 HTTP 请求处理的一部分,Revel 实例化你的控制器,并设置嵌入`revel.Controller`的所有的属性。 Revel 不在请求之间共享实例。 * * * **Controller** 是直接 或 间接嵌入 `*revel.Controller` 的一个struct。 ~~~ type AppController struct { *revel.Controller } ~~~ **Action** 是 **Controller** 的方法。符合下面的条件: * 名称是导出的(首字母大写) * 返回 revel.Result 类型 例如: ~~~ func (c AppController) ShowLogin(username string) revel.Result { .. return c.Render(username) } ~~~ 程序调用 `revel.Controller.Render` 渲染一个模板, 传递给模板一个username参数。**revel.Controller** 有许多方法处理**revel.Result**, 程序也可以自己创建处理方法。 ## Results Result 符合下面的接口: ~~~ type Result interface { Apply(req *Request, resp *Response) } ~~~ 通常, 什么也不响应,直到 **action** 和所有的过滤器返回。此时,Revel写入响应的headers和cookies。(例如设置会话cookie), 然后调用 `Result.Apply` 写入实际响应内容。