Các Hooks của Fiber

Thông qua các hooks được cung cấp bởi framework Fiber, chúng ta có thể ngăn chặn hành vi của framework và tùy chỉnh logic tại các điểm quan trọng.

Bắt đầu từ Fiber v2.30.0, bạn có thể thực thi các hàm người dùng tuỳ chỉnh khi chạy các phương thức cụ thể. Dưới đây là danh sách các hooks này:

  • OnRoute (Route Hook)
  • OnName (Name Hook)
  • OnGroup (Group Hook)
  • OnGroupName (Group Name Hook)
  • OnListen (Listen Hook)
  • OnFork (Fork Hook)
  • OnShutdown (Shutdown Hook)
  • OnMount (Mount Hook)

Hằng số

// Handlers định nghĩa một hàm để tạo hooks cho Fiber.
type OnRouteHandler = func(Route) error
type OnNameHandler = OnRouteHandler
type OnGroupHandler = func(Group) error
type OnGroupNameHandler = OnGroupHandler
type OnListenHandler = func(ListenData) error
type OnForkHandler = func(int) error
type OnShutdownHandler = func() error
type OnMountHandler = func(*App) error

OnRoute (Route Hook)

OnRoute là một hook thực thi hàm người dùng mỗi khi một route được đăng ký. Bạn cũng có thể truy cập các thuộc tính của route thông qua tham số route.

Chữ ký

func (app *App) OnRoute(handler ...OnRouteHandler)

OnName (Name Hook)

OnName là một hook thực thi hàm người dùng mỗi khi một route được đặt tên. Bạn cũng có thể truy cập các thuộc tính của route thông qua tham số route.

Lưu ý: OnName chỉ áp dụng cho các route có tên, không áp dụng cho các nhóm.

Chữ ký

func (app *App) OnName(handler ...OnNameHandler)
  • Ví dụ về OnName
package main

import (
    "fmt"
    "github.com/gofiber/fiber/v2"
)

func main() {
    app := fiber.New()

    app.Get("/", func(c *fiber.Ctx) error {
        return c.SendString(c.Route().Name)
    }).Name("index")

    app.Hooks().OnName(func(r fiber.Route) error {
        fmt.Print("Name: " + r.Name + ", ")
        return nil
    })

    app.Hooks().OnName(func(r fiber.Route) error {
        fmt.Print("Method: " + r.Method + "\n")
        return nil
    })

    app.Get("/add/user", func(c *fiber.Ctx) error {
        return c.SendString(c.Route().Name)
    }).Name("addUser")

    app.Delete("/destroy/user", func(c *fiber.Ctx) error {
        return c.SendString(c.Route().Name)
    }).Name("destroyUser")

    app.Listen(":5000")
}

// Kết quả:
// Name: addUser, Method: GET
// Name: destroyUser, Method: DELETE

OnGroup (Group Hook)

OnGroup là một hook thực thi hàm người dùng mỗi khi một nhóm được đăng ký. Bạn cũng có thể truy cập các thuộc tính của nhóm thông qua tham số group.

Chữ ký

func (app *App) OnGroup(handler ...OnGroupHandler)

OnGroupName (Group Name Hook)

OnGroupName là một hook thực thi hàm người dùng mỗi khi một nhóm được đặt tên. Bạn cũng có thể truy cập các thuộc tính của nhóm thông qua tham số group.

Lưu ý: OnGroupName chỉ áp dụng cho các nhóm có tên, không áp dụng cho các route.

Chữ ký

func (app *App) OnGroupName(handler ...OnGroupNameHandler)

OnListen (Listen Hook)

Hook OnListen được sử dụng để thực thi các hàm người dùng khi thực hiện các hoạt động Listen, ListenTLS, hoặc Listener.

Chữ ký

func (app *App) OnListen(handler ...OnListenHandler)
  • Ví dụ về OnListen
app := fiber.New(fiber.Config{
  DisableStartupMessage: true,
})

app.Hooks().OnListen(func(listenData fiber.ListenData) error {
  if fiber.IsChild() {
      return nil
  }
  scheme := "http"
  if listenData.TLS {
    scheme = "https"
  }
  log.Println(scheme + "://" + listenData.Host + ":" + listenData.Port)
  return nil
})

app.Listen(":5000")

OnFork (Fork Hook)

Hook OnFork được sử dụng để thực thi các hàm người dùng khi thực hiện hoạt động Fork.

Chữ ký

func (app *App) OnFork(handler ...OnForkHandler)

OnShutdown (Shutdown Hook)

Hook OnShutdown được sử dụng để thực thi các hàm người dùng sau khi thực hiện hoạt động Shutdown.

Chữ ký

func (app *App) OnShutdown(handler ...OnShutdownHandler)

OnMount

OnMount là một hook thực hiện các hàm do người dùng định nghĩa sau quá trình mount. Khi một ứng dụng con được mount vào một ứng dụng cha, sự kiện mounting sẽ được kích hoạt, với ứng dụng cha được truyền như một tham số. Nó phù hợp để mount các ứng dụng và nhóm.

Chữ ký

func (h *Hooks) OnMount(handler ...OnMountHandler) 
  • Ví dụ về OnMount
package main

import (
    "fmt"
    "github.com/gofiber/fiber/v2"
)

func main() {
    app := New()
    app.Get("/", testSimpleHandler).Name("x")

    subApp := New()
    subApp.Get("/test", testSimpleHandler)
    
    subApp.Hooks().OnMount(func(parent *fiber.App) error {
        fmt.Print("Đường dẫn mount của ứng dụng cha: "+parent.MountPath())
        // ...

        return nil
    })

    app.Mount("/sub", subApp)
}

// Kết quả:
// Đường dẫn mount của ứng dụng cha: 

Lưu ý: Các hook OnName/OnRoute/OnGroup/OnGroupName nhạy cảm với mounting. Nếu bạn sử dụng các route này trên một ứng dụng con và mount nó, các đường dẫn của các route và nhóm sẽ bắt đầu bằng tiền tố mount.