嗨,目前我正在做一個小專案,我有疑問。
有沒有辦法將資料從中間件傳遞給模板?
例如:
func CheckAuth(c *gin.Context) { //This Middleware gets the user from the session and passes it to the template
session := sessions.Default(c)
user := session.Get(userkey)
// Get if possible the user from the database with id = user
var account models.Account
if err := models.DB.Where("id = ?", user).First(&account).Error; err != nil {
_ = 1
}
// pass the account into every temaplte
c.Next()
原因是我在我的布局中使用用戶并且必須檢查他的用戶名,或者他是否只是 nil 等并且在每個功能中進行傳遞感覺不對?我知道 Laravel 有這樣的東西。
我正在使用 c.HTML 來顯示 html 檔案
提前致謝!
uj5u.com熱心網友回復:
您可以使用 SetFuncMap 或 FuncMap 在模板上創建自定義函式。
您必須在呼叫 LoadHTMLFiles 或 LoadHTMLGlob 之前設定它。
中間件用于控制值,即:struct
這是示例
main.go
package main
import (
"html/template"
"log"
"strconv"
"github.com/gin-gonic/gin"
)
type User struct {
Username string
Age int
}
func setUser(u *User) gin.HandlerFunc {
return func(ctx *gin.Context) {
// u.Age = 100
// u.Username = "Default"
if s, b := ctx.GetQuery("username"); b {
u.Username = s
}
if s, b := ctx.GetQuery("age"); b {
i, err := strconv.Atoi(s)
if err != nil {
panic(err.Error())
}
u.Age = i
}
}
}
var user = &User{"Default", 100}
func GetUsername() string {
return user.Username
}
func GetAge() int {
return user.Age
}
func main() {
r := gin.New()
r.SetFuncMap(template.FuncMap{
"Username": GetUsername,
"Age": GetAge,
})
r.LoadHTMLGlob("*.tmpl")
r.GET("/", setUser(user), func(ctx *gin.Context) {
data := map[string]interface{}{
"title": "Learning Golang Web",
"name": "Batman",
}
ctx.HTML(200, "index.tmpl", data)
})
log.Fatalln(r.Run())
}
索引.tmpl
<!DOCTYPE html>
<html>
<head>
<title>{{.title}}</title>
</head>
<body>
<p>Welcome {{.name}}</p>
<p>Your Username is {{ Username }}</p>
<p>Your Age is {{ Age }}</p>
</body>
</html>
如果你去http://localhost:8080/?username=admin&age=50它會顯示不同的顯示
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/438913.html
