go iris框架 mvc架构模式下,如何给自动注册路由的命名?困扰多时,望大神指点秘境,感谢。

在非MVC架构模式下。路由注册的时候,可以为每一条路由命名,方便做权限管理的时候,自动获取每条路由的中文名。这个问题困扰了很久了,翻阅了很多资料,没有找到解决办法,望大神指点迷津。感谢。

非MVC架构模式下 为每一条路由命名:
router.go

admin.PartyFunc("/users", func(users iris.Party) {
   users.Get("/", controllers.GetAllUsers).Name = "用户列表"
  users.Get("/{id:uint}", controllers.GetUser).Name = "用户详情"
  users.Post("/", controllers.CreateUser).Name = "创建用户"
  users.Put("/{id:uint}", controllers.UpdateUser).Name = "编辑用户"
  users.Delete("/{id:uint}", controllers.DeleteUser).Name = "删除用户"
})

在iris MVC架构模式下面,是注册controller,路由时更加函数名称自动注册的。如何实现向上面代码的功能一样,为每一条路由设置一个中文名称?
router.go

usersParty := v1.Party("/users")
//usersParty.Use(middleware.JwtHandler().Serve, casbinMiddleware.ServeHTTP) //验证jwt token
usersParty.Use(middleware.JwtHandler().Serve) //验证jwt token
users := mvc.New(usersParty)
users.Register(ctx, userService)
users.Handle(new(controllers.UsersController))

users_controller.go

package controllers
import (...)

type UsersController struct {
   Ctx iris.Context
  Service services.IUserService
}

/**
 * 新增用户 * Request Type: POST * Request URL : /api/v1/users/add **/
 func (u *UsersController) PostAdd() {...}

/**
 * 删除一个用户 * Request Type: DELETE * Request URL : /api/v1/users/{param1:int64} **/
 func (r *UsersController) DeleteBy(userId int64) {...}

/**
 * 修改用户 * Request Type: PUT * Request URL : /api/v1/users/{param1:int64} **/
 func (r *UsersController) PutBy(userId int64) {...}

/**
 * 修改个人信息  修改自己的信息 * Request Type: PUT * Request URL : /api/v1/users/info/{param1:int64} **/
 func (r *UsersController) PutInfoBy(userId int64) {...}

/**
 * 修改密码功能 * Request Type: PUT * Request URL : /api/v1/user/pwd/{param1:int64} **/
 func (r *UsersController) PutPwdBy(userId int64) {...}

/**
 * 获取个人信息 登录后获取自己的信息信息 * Request Type: GET * Request URL : /api/v1/users/info **/
 func (r *UsersController) GetInfo() {...}

/**
 * 获取所有用户列表 * Request Type: GET * Request URL : /api/v1/users/all **/
 func (r *UsersController) GetAll() {...}

/**
 * 返回所有角色列表  回收站 * Request Type: GET * Request URL : /api/v1/users/trash **/
 func (r *UsersController) GetTrash() {...}

/**
 * 获取一条user的信息 * Request Type: GET * Request URL : /api/v1/users/{param1:int64} **/
 func (r *UsersController) GetBy(userId int64) {...}
最佳答案

你这样试试吧,没用过iris翻了下godoc和源码。

users.Controllers[0].GetRoute("GetAllUsers") = "用户列表"

godoc.org/github.com/kataras/iris/...

godoc.org/github.com/kataras/iris/...

另外一种你从Context或Controller拿到router.Route对象(应该有这个api),里面应该是直接有控制器函数名称,可能是MainHandlerName属性。

github.com/kataras/iris/blob/8b710b...

3年前 评论
讨论数量: 3

你这样试试吧,没用过iris翻了下godoc和源码。

users.Controllers[0].GetRoute("GetAllUsers") = "用户列表"

godoc.org/github.com/kataras/iris/...

godoc.org/github.com/kataras/iris/...

另外一种你从Context或Controller拿到router.Route对象(应该有这个api),里面应该是直接有控制器函数名称,可能是MainHandlerName属性。

github.com/kataras/iris/blob/8b710b...

3年前 评论

@1112
非常感谢您的指导,问题已经解决了。用第一种方式解决的。第二种方式在context下如何获取router.Route对象,没整明白,自己还要学的东西太多了,继续努力。
再次感谢,回头继续研究研究,去爬一下context下面的源码。如果有知道的小哥哥小姐姐,可以指点一下哦:)

为了方便查阅,实现的代码和结果如下:

// 注册 监控日子记录 控制器
    positionRepository := repositories.NewPositionRepository("MCS_POSITION", db)
    positionService := services.NewPositionService(positionRepository)
    positionPart := v1.Party("/position")
    positionPart.Use(middleware.JwtHandler().Serve)
    position := mvc.New(positionPart)
    position.Register(ctx, positionService)
    position.Handle(new(controllers.PositionController))
    position.Controllers[0].GetRoute("PostAdd").Name = "新增加位置信息"
    position.Controllers[0].GetRoute("DeleteBy").Name = "删除一条位置信息"
    position.Controllers[0].GetRoute("PutBy").Name = "修改位置信息"
    position.Controllers[0].GetRoute("GetAll").Name = "获取所有位置"
    position.Controllers[0].GetRoute("GetTrash").Name = "获取所有位置-回收站"
    position.Controllers[0].GetRoute("GetBy").Name = "获取一条位置详情"

打印的代码:

for _, only := range r.Ctx.Application().GetRoutesReadOnly() {
        golog.Infof(
            "name:%s, path:%s, Method:%s",
            only.Name(), only.Path(), only.Method(),
        )
    }
// 控制台结果如下:

[INFO] 2021/01/04 16:01 name:GET/api/v1/monitor/trash, path:/api/v1/monitor/trash, Method:GET
[INFO] 2021/01/04 16:01 name:POST/api/v1/monitor/add, path:/api/v1/monitor/add, Method:POST
[INFO] 2021/01/04 16:01 name:PUT/api/v1/monitor/{param1:string}, path:/api/v1/monitor/{param1:string}, Method:PUT
[INFO] 2021/01/04 16:01 name:删除一条位置信息, path:/api/v1/position/{param1:int64}, Method:DELETE
[INFO] 2021/01/04 16:01 name:获取所有位置, path:/api/v1/position/all, Method:GET
[INFO] 2021/01/04 16:01 name:获取一条位置详情, path:/api/v1/position/{param1:int64}, Method:GET
[INFO] 2021/01/04 16:01 name:获取所有位置-回收站, path:/api/v1/position/trash, Method:GET
[INFO] 2021/01/04 16:01 name:新增加位置信息, path:/api/v1/position/add, Method:POST
[INFO] 2021/01/04 16:01 name:修改位置信息, path:/api/v1/position/{param1:int64}, Method:PUT
[INFO] 2021/01/04 16:01 name:GET/api/v1/probe/{param1:string}, path:/api/v1/probe/{param1:string}, Method:GET
[INFO] 2021/01/04 16:01 HandlerName iris/hero.makeHandler.func2
[INFO] 2021/01/04 16:01 router name: 监控页设备信息
[INFO] 2021/01/04 16:01 200 32.691307ms 127.0.0.1 GET /api/v1/datacenter/monitor PostmanRuntime/7.26.8

3年前 评论

试试这个 ctx.GetCurrentRoute().MainHandlerName(),控制器应该有调用context的方法我就不找了,godoc进去ctrl+f找关键字route就找到了,RouteReadOnly 接口恰好是router.Route属性的各种get,context只能只读router.Route,好像不能去设置Name。

file

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!