Hooks | Goffee
Description: A Hook is a pieces of functional that gets executed either before handling the request or after.

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