函数注册

函数注册方式是最简单且最灵活的的路由注册方式,注册的服务可以是一个实例化对象的方法地址,也可以是一个包方法地址。服务需要的数据可以通过模块内部变量形式或者对象内部变量形式进行管理,开发者可根据实际情况进行灵活控制。

我们可以直接通过BindHandler方法完成回调函数的注册,在框架的开发手册中很多地方都使用了回调函数注册的方式来做演示,因为这种注册方式比较简单。

示例1,包方法注册

package main

import (
	"github.com/gogf/gf/container/gtype"
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/net/ghttp"
)

var (
	total = gtype.NewInt()
)

func Total(r *ghttp.Request) {
	r.Response.Write("total:", total.Add(1))
}

func main() {
	s := g.Server()
	s.BindHandler("/total", Total)
	s.SetPort(8199)
	s.Run()
}

在该示例中,我们通过包方法的形式来注册路由。该方法返回总共访问的次数,由于涉及到并发安全,因此total变量使用了gtype.Int并发安全类型。执行后,当我们不停访问 http://127.0.0.1:8199/total 时,可以看到返回的数值不停递增。

示例2,对象方法注册

package main

import (
	"github.com/gogf/gf/container/gtype"
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/net/ghttp"
)

type Controller struct {
	total *gtype.Int
}

func (c *Controller) Total(r *ghttp.Request) {
	r.Response.Write("total:", c.total.Add(1))
}

func main() {
	s := g.Server()
	c := &Controller{
		total: gtype.NewInt(),
	}
	s.BindHandler("/total", c.Total)
	s.SetPort(8199)
	s.Run()
}

该示例与示例1的实现的效果一致,但我们使用了对象来封装业务逻辑所需的变量,使用回调函数注册来灵活注册对应的对象方法。

Content Menu

  • No labels

2 Comments

  1. 能否增加一个新的函数BindHandlerWithName, 为这个handler 设置一个新名字,因为很多时候这个handler是个匿名函数如yy=func(){  ... },满屏幕都是xx.func1 这种形式,而不是yy

    这样打印出路由表的时候,反而不好查到底是哪个函数,  能否增加一个自定义名字的功能,如下图name所示, 比如, 这样把“yy” 传给BindHandlerWithName,就能把yy 打印到路由表上

    func (s *Server) BindHandlerWithName(pattern string, handler HandlerFunc, name string) {
      s.doBindHandler(pattern, handler, nil, "", name)
    }

    func (s *Server) doBindHandler(
     pattern string, handler HandlerFunc,
      middleware []HandlerFunc, source string, name string
    ) {

      if name == "" { //兼容老逻辑, BindHandler可以传一个""过来

          name = gdebug.FuncPath(handler)

      }
      s.setHandler(pattern, &handlerItem{
        itemName: name,
        itemType: gHANDLER_TYPE_HANDLER,
        itemFunc: handler,
        middleware: middleware,
        source: source,
      })

    }


    整体改动也很小,为了提建议专门注册的账号  麻烦john看一下哈, 谢谢

  2. 建议你定义一个函数后再注册到路由管理器中,这样在路由表中具有识别性,而不是增加一个标识来做识别。