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

相關文章
相關標籤/搜索