beego 自定义控制器与路由

框架浅析

  这是以前使用bee建立的webapp目录层级结构:css

├── conf			配置文件
│   └── app.conf
├── controllers		控制器
│   └── default.go
├── main.go			主程序
├── models			模型
├── routers			路由
│   └── router.go
├── static			静态资源
│   ├── css
│   ├── img
│   └── js
│       └── reload.min.js
├── tests			测试
│   └── default_test.go
├── views			视图
│   └── index.tpl
└── webapp

  

  先看main.go中的代码,以下:git

package main
import (
	_ "webapp/routers"
	"github.com/astaxie/beego"
)
func main() {
	beego.Run()
}

  第四行中,导入beego框架,几乎每一个文件都有这一行,因此就先不深究这个包。github

  在第3行导入webapp/routers包,前面加一个下划线,表示只是用那个包里面的init()函数。web

  能够看一下,webapp/routers包里面的代码webapp/routers/router.go:bash

package routers
import (
	"webapp/controllers"
	"github.com/astaxie/beego"
)
func init() {
	beego.Router("/", &controllers.MainController{})
}

  在router.go代码中,导入了webapp/controllers包,能够继续深刻,看一下这个包里面有什么代码(webapp/controllers/default.go):app

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"
}

  能够看到,default.go中声明了一个MainController的结构体,定义了一个Get方法。框架

  回到webapp/routers/router.go文件中,导入webapp/controllers包以后(包含webapp/controllers/default.go文件),而后在init()中有这么一条语句:webapp

beego.Router("/", &controllers.MainController{})

  这个语句和http.Handle绑定处理器是同样的格式,都是用来为指定路由绑定处理器的。函数

  bee.Router声明以下:测试

func Router(rootpath string, c ControllerInterface, mappingMethods ...string) *App

  经过Router函数的声明可知,default.go中的MainController定义的Get方法,实际上是实现了ControllerInterface。

 

  分析到这里,咱们已经知道如下内容:

  一、运行main.go的时候,会先导入webapp/routers包

  二、在webapp/routers包中导入webapp/controllers包,而后为指定的路由绑定指定的处理器便可

  三、在webapp/controllers包中,实现ControllerInterface接口中的Get方法便可。

  综上,咱们就能够自定义本身的路由和控制器了。

 

动手实践

自定义控制器

  依样画葫芦,照着webapp/routers/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"
}

//自定义控制器
type ArticleController struct{
	beego.Controller
}
//实现接口
func (article *ArticleController) Get(){
	article.Data["Website"] = "My Web Site"
	article.Data["Email"] = "www.cnblogs.com/-beyond"
	article.TplName = "index.tpl"
}

  能够将上面的代码整理一下,单独在一个文件中建立一个控制器,推荐使用下面这种方法:

  在webapp/routers目录下建立一个文章控制器,article.go

package controllers
import (
	"github.com/astaxie/beego"
)
//自定义控制器
type ArticleController struct {
	beego.Controller
}
//实现ControllerInterface接口的Get方法
func (article *ArticleController) Get() {
	article.Data["Website"] = "My Web Site"
	article.Data["Email"] = "www.cnblogs.com/-beyond"
	article.TplName = "index.tpl"
}

  

自定义路由

  直接在webapp/routers/router.go中修改便可:

package routers
import (
	"webapp/controllers"

	"github.com/astaxie/beego"
)
func init() {
	beego.Router("/", &controllers.MainController{})
	
	//增长本身的路由
	beego.Router("/article", &controllers.ArticleController{})
}

  

测试结果

  访问localhost:8080/article

相关文章
相关标签/搜索