Trong phần này chúng ta sẽ tìm hiểu cách ghi đè các phương thức của Context hiện có.

Context là một interface. Tuy nhiên như bạn có thể biết, khi sử dụng các framework khác, bạn không có chức năng ghi đè đó ngay cả khi nó được sử dụng làm interface. Với Iris bạn có thể đính kèm triển khai của mình vào context pool bằng phương thức app.ContextPool.Attach.

  1. Hãy bắt đầu bằng cách import "github.com/kataras/iris/v12/context".
  2. Bước thứ hai, tạo Context.
  3. Thêm các phương thức DoNext trong đó chúng chỉ gọi các hàm context.Do và context.Next 
  4. Sử dụng ContextPool của ứng dụng để đặt nó làm Context nên được sử dụng cho các trình xử lý của tuyến.

Ví dụ:

Chú ý đọc cả comments.

package main

import (
    "reflect"

    "github.com/kataras/iris/v12"
    // 1.
    "github.com/kataras/iris/v12/context"
)

// 2.
// Create your own custom Context, put any fields you'll need.
type MyContext struct {
    // Embed the `iris.Context` - 
    // It's totally optional but you will need this if you
    // don't want to override all the context's methods!
    iris.Context
}

// Optionally: validate MyContext implements iris.Context on compile-time.
var _ iris.Context = &MyContext{}

// 3.
func (ctx *MyContext) Do(handlers context.Handlers) {
    context.Do(ctx, handlers)
}


// 3.
func (ctx *MyContext) Next() {
    context.Next(ctx)
}

// [Override any context's method you want here...]
// Like the HTML below:

func (ctx *MyContext) HTML(htmlContents string) (int, error) {
    ctx.Application().Logger().Infof("Executing .HTML function from MyContext")

    ctx.ContentType("text/html")
    return ctx.WriteString(htmlContents)
}

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

    // 4.
    app.ContextPool.Attach(func() iris.Context {
        return &MyContext{
            // If you use the embedded Context,
            // call the `context.NewContext` to create one:
            Context: context.NewContext(app),
        }
    })

    // Register a view engine on .html files inside the ./view/** directory.
    app.RegisterView(iris.HTML("./view", ".html"))

    // Register your route, as you normally do
    app.Handle("GET", "/", recordWhichContextForExample,
    func(ctx iris.Context) {
        // use the context's overridden HTML method.
        ctx.HTML("<h1> Hello from my custom context's HTML! </h1>")
    })

    // This will be executed by the
    // MyContext.Context embedded default context
    // when MyContext is not directly define the View function by itself.
    app.Handle("GET", "/hi/{firstname:alphabetical}",recordWhichContextForExample,
    func(ctx iris.Context) {
        firstname := ctx.Values().GetString("firstname")

        ctx.ViewData("firstname", firstname)
        ctx.Gzip(true)

        ctx.View("hi.html")
    })

    app.Run(iris.Addr(":8080"))
}

// Should always print "($PATH) Handler is executing from 'MyContext'"
func recordWhichContextForExample(ctx iris.Context) {
    ctx.Application().Logger().Infof("(%s) Handler is executing from: '%s'",
        ctx.Path(), reflect.TypeOf(ctx).Elem().Name())

    ctx.Next()
}

Phần tiếp theo chúng ta sẽ tìm hiểu về Context Methods