GoFrame 模板引擎-基本介紹

2022-04-08 09:21 更新

模板引擎特點(diǎn)

  1. 簡(jiǎn)單、易用、強(qiáng)大;
  2. 支持多模板目錄搜索;
  3. 支持?layout?模板設(shè)計(jì);
  4. 支持模板視圖對(duì)象單例模式;
  5. 與配置管理模塊原生集成,使用方便;
  6. 底層采用了二級(jí)緩存設(shè)計(jì),性能高效;
  7. 新增模板標(biāo)簽及大量的內(nèi)置模板變量、模板函數(shù);
  8. 支持模板文件修改后自動(dòng)更新緩存機(jī)制,對(duì)開發(fā)過程更友好;
  9. ?define/template?標(biāo)簽支持跨模板調(diào)用(同一模板路徑包括子目錄下的模板文件);
  10. ?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)要說明: 

  1. ?gview.Get?用于根據(jù)給定的一個(gè)模板目錄路徑,獲得對(duì)應(yīng)的單例模板引擎對(duì)象;
  2. ?gview.New?同樣可以根據(jù)給定的模板目錄路徑創(chuàng)建模板引擎對(duì)象,但沒有單例管理;
  3. ?SetPath/AddPath?用于設(shè)置/添加當(dāng)前模板引擎對(duì)象的模板目錄路徑,其中?SetPath?會(huì)覆蓋所有的模板目錄設(shè)置,推薦使用?AddPath?;
  4. ?Assign/Assigns?用于設(shè)置模板變量,通過該模板引擎解析的所有模板均可以使用這些模板變量;
  5. ?BindFunc?用于綁定模板函數(shù),具體使用方法參考后續(xù)示例程序;
  6. ?Parse/ParseContent?用于解析模板文件/內(nèi)容,可以在解析時(shí)給定臨時(shí)的模板變量及模板函數(shù);
  7. ?SetDelimiters?用于設(shè)置該模板引擎對(duì)象的模板解析分隔符號(hào),默認(rèn)為?{{ }}?(與?vuejs?前端框架有沖突);

需要注意,從?goframe v1.16?版本開始,所有模板的解析方法都額外增加了第一個(gè)輸入?yún)?shù)為?Context?上下文變量的傳遞。

示例1,解析模板文件

?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?

示例2,解析模板內(nèi)容

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?

示例3,自定義模板分隔符

在項(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)添加以下模板文件搜索目錄:

  1. 當(dāng)前工作目錄及其下的?template?目錄:例如當(dāng)前的工作目錄為?/home/www?時(shí),將會(huì)添加?/home/www?及?/home/www/template?;
  2. 當(dāng)前可執(zhí)行文件所在目錄及其下的?template?目錄:例如二進(jìn)制文件所在目錄為?/tmp?時(shí),將會(huì)添加?/tmp?及?/tmp/template?;
  3. 當(dāng)前?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í)行配置文件檢索:

  1. (推薦)單例模式獲取全局?View?對(duì)象,通過?SetPath?方法手動(dòng)修改;
  2. 修改命令行啟動(dòng)參數(shù) -  ?gf.gview.path?;
  3. 修改指定的環(huán)境變量 -  ?GF_GVIEW_PATH?;

例如,我們的執(zhí)行程序文件為?main?,那么可以通過以下方式修改模板引擎的模板目錄(?Linux?下):

1、通過單例模式(推薦)

g.View().SetPath("/opt/template")

2、通過命令行參數(shù)

./main --gf.gview.path=/opt/template/

3、通過環(huán)境變量

  • 啟動(dòng)時(shí)修改環(huán)境變量:

GF_GVIEW_PATH=/opt/config/; ./main

  • 使用?genv?模塊來修改環(huán)境變量:

genv.Set("GF_GVIEW_PATH", "/opt/template")

自動(dòng)檢測(cè)更新

模板引擎使用了精心設(shè)計(jì)的緩存機(jī)制,當(dāng)模板文件第一次被讀取后會(huì)被緩存到內(nèi)存,下一次讀取時(shí)將會(huì)直接從緩存中獲取,以提高執(zhí)行效率。并且,模板引擎提供了對(duì)模板文件的自動(dòng)檢測(cè)更新機(jī)制,當(dāng)模板文件在外部被修改后,模板引擎能夠即時(shí)地監(jiān)控到并刷新模板文件的緩存內(nèi)容。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)