原文地址:
Beego源码解析(二)-路由机制
上一篇文章介绍了 Beego关于配置项初始化的流程。那么今天就来说说在 Beego中非常重要的路由机制.
Beego到现在 v1.6.1版本为止支持了:固定路由、正则路由、自动路由这三种路由方法.
关于这三种路由的详细用法可以参考官方给出的开发文档,这里面已经记录的很全面了.
所以我们今天这篇文章就是要介绍这三种路由是如何在 Beego内部实现的.
关于 Beego的源码注释可以见我的Github
一个简单的示例
让我们先从官网给出的示例开始,下面是会在浏览器中打印”HelloWorld”的一个Beego程序.
package main
import(
"github.com/astaxie/beego"
)
type MainController struct {
beego.Controller
}
func (this *MainController) Get() {
this.Ctx.WriteString("Hello World")
}
func main() {
beego.Router("/",&MainController{})
beego.Run()
}
我们需要先知道它干了什么:
1. 自定义了一个内含 beego.Controller(这个类型后面会讲到)控制器的 MainController
2. 重写了 MainController的 Get()方法,熟悉 Go语言的应该知道这个方法来自 Controller
3. 在 main()函数中调用了 beego.Router()方法注册了路由”/”和一个 MainController实例
4. 执行了 beego.Run()方法启用了 beego程序
重要的类型和接口
为了不在接下来的流程中打断,在介绍流程之前需要先了解 beego中关于路由的一些东西
ControllerInterface 接口
源文件中的位置: beego/controller.go:90
type ControllerInterface interface {
Init(ct *context.Context,controllerName,actionName string,app interface{})
Prepare()
Get()
Post()
Delete()
Put()
Head()
Patch()
Options()
Finish()
Render() error
XSRFToken() string
CheckXSRFCookie() bool
HandlerFunc(fn string) bool
URLMapping()
}
这个接口定义了 15个方法,看名字就能够知道这是每个 Controller都需要实现的接口
Controller结构体
位置 beego/controller.go:60
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
Layout string
LayoutSections map[string]string // the key is the section name and the value is the template name
TplExt string
EnableRender bool
// xsrf data
_xsrfToken string
XSRFExpire int
EnableXSRF bool
// session
CruSession session.Store
}
这个结构体保存了作为 Controller的一些必要的信息,一些基础的字段看名字就比较好理解
在这里的 context.Context(B