W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
layout
?模板設(shè)計(jì);define/template
?標(biāo)簽支持跨模板調(diào)用(同一模板路徑包括子目錄下的模板文件);include
?標(biāo)簽支持任意路徑的模板文件引入;通用視圖管理即使用原生的模板引擎?gview
?模塊來實(shí)現(xiàn)模板管理,包括模板讀取展示,模板變量渲染等等。可以使用通過方法?gview.Instance
?來獲取視圖單例對(duì)象,并可以按照單例對(duì)象名稱進(jìn)行獲取。同時(shí)也可以通過對(duì)象管理器?g.View()
?來獲取默認(rèn)的單例?gview
?對(duì)象。
接口文檔:
https://pkg.go.dev/github.com/gogf/gf/v2/os/gview
簡(jiǎn)要說明:
gview.Get
?用于根據(jù)給定的一個(gè)模板目錄路徑,獲得對(duì)應(yīng)的單例模板引擎對(duì)象;gview.New
?同樣可以根據(jù)給定的模板目錄路徑創(chuàng)建模板引擎對(duì)象,但沒有單例管理;SetPath/AddPath
?用于設(shè)置/添加當(dāng)前模板引擎對(duì)象的模板目錄路徑,其中?SetPath
?會(huì)覆蓋所有的模板目錄設(shè)置,推薦使用?AddPath
?;Assign/Assigns
?用于設(shè)置模板變量,通過該模板引擎解析的所有模板均可以使用這些模板變量;BindFunc
?用于綁定模板函數(shù),具體使用方法參考后續(xù)示例程序;Parse/ParseContent
?用于解析模板文件/內(nèi)容,可以在解析時(shí)給定臨時(shí)的模板變量及模板函數(shù);SetDelimiters
?用于設(shè)置該模板引擎對(duì)象的模板解析分隔符號(hào),默認(rèn)為?{{ }}
?(與?vuejs
?前端框架有沖突);需要注意,從?goframe v1.16
?版本開始,所有模板的解析方法都額外增加了第一個(gè)輸入?yún)?shù)為?Context
?上下文變量的傳遞。
?index.tpl
?
id:{{.id}}, name:{{.name}}
?main.go
?
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
func main() {
s := g.Server()
s.BindHandler("/template", func(r *ghttp.Request) {
r.Response.WriteTpl("index.tpl", g.Map{
"id": 123,
"name": "john",
})
})
s.SetPort(8199)
s.Run()
}
執(zhí)行后,訪問 http://127.0.0.1:8199/template 可以看到解析后的內(nèi)容為:?id:123, name:john
?
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
func main() {
s := g.Server()
s.BindHandler("/template", func(r *ghttp.Request){
tplContent := `id:{{.id}}, name:{{.name}}`
r.Response.WriteTplContent(tplContent, g.Map{
"id" : 123,
"name" : "john",
})
})
s.SetPort(8199)
s.Run()
}
執(zhí)行后,訪問 http://127.0.0.1:8199/template 可以看到解析后的內(nèi)容為:?id:123, name:john
?
在項(xiàng)目中我們經(jīng)常會(huì)遇到?Golang
?默認(rèn)模板變量分隔符號(hào)與?Vue
?的變量分隔符號(hào)沖突的情況(都使用的是?{{ }}
?),我們可以使用?SetDelimiters
?方法來自定義全局的?Golang
?模板變量分隔符號(hào):
// main.go
package main
import (
"context"
"fmt"
"github.com/gogf/gf/v2/frame/g"
)
func main() {
v := g.View()
v.SetDelimiters("${", "}")
b, err := v.Parse(
context.TODO(),
"gview_delimiters.tpl",
map[string]interface{}{
"k": "v",
})
fmt.Println(err)
fmt.Println(b)
}
<!-- gview_delimiters.tpl -->
test.tpl content, vars: ${.}
執(zhí)行后,輸出結(jié)果為:
<nil>
test.tpl content, vars: map[k:v]
?gf
?框架的模板引擎支持非常靈活的多目錄自動(dòng)搜索功能,通過?SetPath
?可以修改模板目錄為唯一的一個(gè)目錄地址,同時(shí),我們可以通過?AddPath
?方法添加多個(gè)搜索目錄,模板引擎底層將會(huì)按照添加目錄的順序作為優(yōu)先級(jí)進(jìn)行自動(dòng)檢索。直到檢索到一個(gè)匹配的文件路徑為止,如果在所有搜索目錄下查找不到模板文件,那么會(huì)返回失敗。
默認(rèn)目錄配置:
?gview
?視圖對(duì)象初始化時(shí),默認(rèn)會(huì)自動(dòng)添加以下模板文件搜索目錄:
template
?目錄:例如當(dāng)前的工作目錄為?/home/www
?時(shí),將會(huì)添加?/home/www
?及?/home/www/template
?;template
?目錄:例如二進(jìn)制文件所在目錄為?/tmp
?時(shí),將會(huì)添加?/tmp
?及?/tmp/template
?;main
?源代碼包所在目錄及其下的?template
?目錄(僅對(duì)源碼開發(fā)環(huán)境有效):例如?main
?包所在目錄為?/home/john/workspace/gf-app
?時(shí),將會(huì)添加?/home/john/workspace/gf-app
?及?/home/john/workspace/gf-app/template
?;我們可以通過以下方式修改視圖對(duì)象的模板文件搜索目錄,視圖對(duì)象將會(huì)只在該指定目錄執(zhí)行配置文件檢索:
View
?對(duì)象,通過?SetPath
?方法手動(dòng)修改;gf.gview.path
?;GF_GVIEW_PATH
?;例如,我們的執(zhí)行程序文件為?main
?,那么可以通過以下方式修改模板引擎的模板目錄(?Linux
?下):
1、通過單例模式(推薦)
g.View().SetPath("/opt/template")
2、通過命令行參數(shù)
./main --gf.gview.path=/opt/template/
3、通過環(huán)境變量
GF_GVIEW_PATH=/opt/config/; ./main
genv
?模塊來修改環(huán)境變量:genv.Set("GF_GVIEW_PATH", "/opt/template")
模板引擎使用了精心設(shè)計(jì)的緩存機(jī)制,當(dāng)模板文件第一次被讀取后會(huì)被緩存到內(nèi)存,下一次讀取時(shí)將會(huì)直接從緩存中獲取,以提高執(zhí)行效率。并且,模板引擎提供了對(duì)模板文件的自動(dòng)檢測(cè)更新機(jī)制,當(dāng)模板文件在外部被修改后,模板引擎能夠即時(shí)地監(jiān)控到并刷新模板文件的緩存內(nèi)容。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: