• beego 自定义控制器与路由


    框架浅析

      这是之前使用bee创建的webapp目录层级结构:

    ├── 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中的代码,如下:

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

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

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

      可以看一下,webapp/routers包里面的代码webapp/routers/router.go:

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

      在router.go代码中,导入了webapp/controllers包,可以继续深入,看一下这个包里面有什么代码(webapp/controllers/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"
    }
    

      可以看到,default.go中声明了一个MainController的结构体,定义了一个Get方法。

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

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

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

      bee.Router声明如下:

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

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

      分析到这里,我们已经知道以下内容:

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

      2、在webapp/routers包中导入webapp/controllers包,然后为指定的路由绑定指定的处理器即可

      3、在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

  • 相关阅读:
    C/C++ 链接汇总
    C# 网页操作
    Win10屏幕开始菜单图标丢失修复方案无意中发现的...
    AI 人工智能
    GIT 命令
    Layui / WEB UI
    PHP DES解密 对应Java SHA1PRNG方式加密
    视频参数介绍及关系《转》
    分布式时系统/服务 数据一致性方案
    JS埋点 小结
  • 原文地址:https://www.cnblogs.com/-beyond/p/9317926.html
Copyright © 2020-2023  润新知