命名路由

命名路由用於反向路由生成。

  1. router.Get("/login", login, clevergo.RouteName("login"))
  2. router.Get("/posts/:year/:month/:day/:slug", queryPost, clevergo.RouteName("post"))

然後我們可以在中間件、處理器和視圖使用。

  1. func handler(ctx *clevergo.Context) error {
  2. loginURL, err := ctx.RouteURL("login")
  3. fmt.Println(loginURL.String()) // /login
  4. postURL, err := ctx.RouteURL("post")
  5. fmt.Println(err) // route "post" parameter "year" is required
  6. postURL, err = ctx.RouteURL("post", "year", "2020", "month", "04", "day", "09", "slug", "hello world")
  7. fmt.Println(postURL.String()) // /posts/2020/04/09/hello%20world
  8. // 參數是無序的,下面代碼返回相同結果。
  9. postURL, err = ctx.RouteURL("post", "month", "04", "slug", "hello world", "day", "09", "year", "2020")
  10. fmt.Println(postURL.String()) // /posts/2020/04/09/hello%20world
  11. return err
  12. }

ctx.RouteURLrouter.URL 的別名。

匹配路由

匹配路由是另一種生成當前路由 URL 而不需要命名的方法。

  1. func listPost(ctx *clevergo.Context) error {
  2. nextURL, nil := ctx.Route.URL()
  3. page := ctx.DefaultQuery("page", "1")
  4. pageNum, nil := strconv.Atoi(page)
  5. page = strconv.Itoa(pageNum + 1)
  6. q := nextURL.Query()
  7. q.Set("page", page)
  8. nextURL.RawQuery = q.Encode()
  9. fmt.Println(nextURL.String()) // /posts?page=2, /posts?page=3 ...
  10. return nil
  11. }
  12. router.Get("/posts", listPost)

匹配路由不能在全局路由使用,因爲路由解析是在調用全局中間件後才觸發,參閱請求的生命週期