V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  leven5  ›  全部回复第 1 页 / 共 1 页
回复总数  1
怎么说,感觉一股浓浓的 laravel 味儿。
拿 route 给你提一个小小的建议吧,我觉得可能要比你在 route.go 注册路由可能要方便一些,尤其后台,几百个路由都是稀松平常,到后期注册路由会非常不方便。
我觉得把注册的逻辑交给 controller ,然后全部挂到一个 controller 集合的结构体上,再通过反射实现注册路由,可能会比你现在方便一些,当然也有可能是因为我用 wire 才会方便,反正就是个小建议,供你参考。

```GO
// controller.go 的 wire provider ,这是我的逻辑,不用 wire 的话手动注入各个 controller 到 Controller struct 中也是一样
var ControllerProviderSet = wire.NewSet(
wire.Struct(new(Controller), "*"),
NewUserController,
NewRouteRegistrar,
)

// controller.go
type Controller struct {
User *UserController
}

type setupable interface {
setup(engine *gin.Engine)
}

var _ server.Routes = (*Controller)(nil)

func (c Controller) SetupRoutes(engine *gin.Engine) {
ref := reflect.ValueOf(c)

for i := 0; i < ref.NumField(); i++ {
iterateField := ref.Field(i)
if iterateField.Kind() == reflect.Ptr {
iterateField = iterateField.Elem()
}
if iterateField.Kind() != reflect.Struct {
continue
}
if !iterateField.CanInterface() || iterateField.Interface() == nil {
continue
}
iterateController, ok := iterateField.Interface().(setupable)
if !ok {
continue
}
iterateController.setup(engine)
}
}

func NewRouteRegistrar(c *Controller) server.Routes {
return c
}

// user_controller.go
func (c UserController) setup(server *gin.Engine) {
g := server.Group("/user")
g.POST("/login", c.Login)
}

// server/server.go
type Routes interface {
SetupRoutes(s *gin.Engine)
}

func NewServer(r Routes) {
s := gin.New()
r.SetupRoutes(s)
}
```
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3578 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 9ms · UTC 04:19 · PVG 12:19 · LAX 20:19 · JFK 23:19
Developed with CodeLauncher
♥ Do have faith in what you're doing.