1. 程式人生 > 實用技巧 >go iris分組路由和中介軟體

go iris分組路由和中介軟體

package main

import (
	"github.com/kataras/iris/v12"
)

func main() {
	// 1.建立mvc例項
	app := iris.New()

	// 2.設定錯誤等級
	//app.Logger().SetLevel("debug")

	// 3.註冊模板
	htmlEngine := iris.HTML("./web/views", ".html") // 從./web/views目錄下載入所有以.html為字尾檔案,並解析他們
	htmlEngine.Layout("shared/layout.html")         // 相當於組成頁面的框架html,其他模板填充進該layout
	htmlEngine.Reload(true)                         // 每次重新載入模板
	app.RegisterView(htmlEngine)                    // 註冊該模板

	// 4.設定靜態檔案目錄
	app.HandleDir("/public", "./public/") // 外網訪問/public檔案就是訪問web.exe同級目錄下public下檔案

	// 5.設定異常頁面
	app.OnAnyErrorCode(func(ctx iris.Context) { // 自定義錯誤,錯誤碼在100~511自動觸發
		ctx.ViewData("message", ctx.Values().GetStringDefault("message", "訪問頁面出錯")) // 繫結資料
		ctx.ViewLayout("shared/layout.html")
		ctx.View("shared/error.html")
	})

	// 6.註冊控制器
	app.Use(bigbefore)	// 全域性before
	app.Done(bigafter)	// 全域性after
	app.UseGlobal(global)
	users := app.Party("/user", middleHandlerUser)   // user組,訪問該組下路由都會觸發middleHandlerUser方法
	users.Use(b)                                     // user組的前置函式,在middleHandlerUser之後執行
	users.Done(a)                                   // user組的後置函式
	users.Get("", routeUser)                         // http://127.0.0.1:8080/user
	users.Get("/test", before, routeUserTest, after) // http://127.0.0.1:8080/user/test 依次執行 before, routeUserTest, after 方法
	users.Get("/user/test", routeUserUserTest)       // http://127.0.0.1:8080/user/user/test

	test := app.Party("/test") // 不使用middleHandlerUser
	test.Get("", routeTest)    // http://127.0.0.1:8080/test

	// 7.啟動服務
	app.Run(iris.Addr(":8080"))
}

func global(ctx iris.Context) {
	ctx.HTML("global | ")
	ctx.Next()
}

func b(ctx iris.Context) {
	ctx.HTML("user組before | ")
	ctx.Next()
}

func a(ctx iris.Context) {
	ctx.HTML("user組after | ")
	ctx.Next()
}

func middleHandlerUser(ctx iris.Context) {
	ctx.HTML("user組middleHandler | ")
	ctx.Next()
}

func routeUserUserTest(ctx iris.Context) {
	ctx.WriteString("/user/user/test | ")
	ctx.Next()
}

func routeUser(ctx iris.Context) {
	ctx.WriteString("/user | ")
	ctx.Next()
}

func routeUserTest(ctx iris.Context) {
	ctx.WriteString("/user/test | ")
	ctx.Next()
}

func before(ctx iris.Context) {
	ctx.WriteString("我是/user/test的before方法 | ")
	ctx.Next()
}

func after(ctx iris.Context) {
	ctx.WriteString("我是/user/test的after方法 | ")
	ctx.Next()
}

func routeTest(ctx iris.Context) {
	ctx.WriteString("/test | ")
	ctx.Next()
}

func bigbefore(ctx iris.Context) {
	ctx.WriteString("我是bigbefore | ")
	ctx.Next()
}

func bigafter(ctx iris.Context) {
	ctx.WriteString("我是bigafter | ")
	ctx.Next()
}

結果:

http://127.0.0.1:8080/user

global | 我是bigbefore | user組middleHandler | user組before | /user | 我是bigafter | user組after |
http://127.0.0.1:8080/user/test
global | 我是bigbefore | user組middleHandler | user組before | 我是/user/test的before方法 | /user/test | 我是/user/test的after方法 | 我是bigafter | user組after |
http://127.0.0.1:8080/user/user/test
global | 我是bigbefore | user組middleHandler | user組before | /user/user/test | 我是bigafter | user組after |

http://127.0.0.1:8080/test

global | 我是bigbefore | /test | 我是bigafter |

  

注意:路由組內部的 app.Done 方法會最晚執行,比全域性的 app.Done 方法更晚執行