Skip to main content

Hooks

A Hook is a pieces of functional that gets executed either before handling the request or after. Hooks are located in the directory hooks/ in the root directory of the project. A Hook in Goffee is simply a function of type core.Hook that gets assigned to routes so that it can be executed before or after the execution of the request's controller.

A Hook to be executed before processing the request

In case the logic gets defined before calling the function c.Next(). Below an example of a hook to executed before processing the request

package hooks

import (
"fmt"

"git.smarteching.com/goffee/core"
)

var myHook core.Hook = func(c *core.Context) {
// Logic goes here ...
c.Next()
}

To assign this hook myHook to a specific route, simply pass it as a third parameter to the route's definition, check this code below for more info:

controller.Get("/", controllers.Login, hooks.myHook)

A Hook to be executed after processing the request

In case the logic gets defined after calling the function c.Next(). Below an example of a hook to be executed after processing the request

package hooks

import (
"fmt"

"git.smarteching.com/goffee/core"
)

var myHook core.Hook = func(c *core.Context) {
c.Next()
// Logic goes here ...
}

To assign this hook myHook to a specific route, simply pass it as a third parameter to the route's definition, check the code below:

router.Get("/", controllers.Login, hooks.myHook)

Assigning multiple hooks to routes

You can simply pass them as a second, third, fourth, etc; parameters to the route's definition, regardless of the hook been a before request handling hook or an after request handling hook, here is how:

controller.Get("/", 
controllers.Login,
hooks.myHook1,
hooks.myHook2,
hooks.myHook3
)

Return response from the hook

Sometimes you might want to return the response to users from the hook, you can achieve that by simply calling the function ForceSendResponse() on the Response property on the context object.

package hooks

import (
"git.smarteching.com/goffee/core"
)

var UnauthorizedCheck core.Hook = func(c *core.Context) {
// Logic goes here ...
c.Response.
SetStatusCode(401).
SetContentType("text/html").
HTML("<h1>unauthorized.</h1>").
ForceSendResponse()

c.Next()
}

Registering a hook globally to all routes

You can register hooks globally in the file /register-global-hooks.go in the root directory of the project. Simply pass the hook as an argument to the function core.UseHook(your-hook), here is how:

package main

import (
"git.smarteching.com/goffee/core"
"git.smarteching.com/goffee/[my-project]/hooks"
)

func registerGlobalHooks() {
//########################################
//# Global middlewares registration #####
//########################################

// Register global middlewares here ...
core.UseHook(hooks.HandleNotFound)
core.UseHook(hooks.ExampleHook)
}

Note

Always remember to call c.Next() function in your hooks in the right place