模板引擎特点
- 简单、易用、强大;
- 支持多模板目录搜索;
- 支持
layout
模板设计; - 支持模板视图对象单例模式;
- 与配置管理模块原生集成,使用方便;
- 底层采用了二级缓存设计,性能高效;
- 新增模板标签及大量的内置模板变量、模板函数;
- 支持模板文件修改后自动更新缓存机制,对开发过程更友好;
define
/template
标签支持跨模板调用(同一模板路径包括子目录下的模板文件);include
标签支持任意路径的模板文件引入;
通用视图管理
通用视图管理即使用原生的模板引擎 gview
模块来实现模板管理,包括模板读取展示,模板变量渲染等等。可以使用通过方法 gview.Instance
来获取视图单例对象,并可以按照单例对象名称进行获取。同时也可以通过对象管理器 g.View()
来获取默认的单例 gview
对象。
接口文档:
https://pkg.go.dev/github.com/gogf/gf/v2/os/gview
简要说明:
gview.Get
用于根据给定的一个模板目录路径,获得对应的单例模板引擎对象;gview.New
同样可以根据给定的模板目录路径创建模板引擎对象,但没有单例管理;SetPath/AddPath
用于设置/添加当前模板引擎对象的模板目录路径,其中SetPath
会覆盖所有的模板目录设置,推荐使用AddPath
;Assign/Assigns
用于设置模板变量,通过该模板引擎解析的所有模板均可以使用这些模板变量;BindFunc
用于绑定模板函数,具体使用方法参考后续示例程序;Parse/ParseContent
用于解析模板文件/内容,可以在解析时给定临时的模板变量及模板函数;SetDelimiters
用于设置该模板引擎对象的模板解析分隔符号,默认为{{ }}
(与vuejs
前端框架有冲突);
需要注意,从 goframe v1.16
版本开始,所有模板的解析方法都额外增加了第一个输入参数为 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()
}
执行后,访问 http://127.0.0.1:8199/template 可以看到解析后的内容为: id:123, name:john
示例2,解析模板内容
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()
}
执行后,访问 http://127.0.0.1:8199/template 可以看到解析后的内容为: id:123, name:john
示例3,自定义模板分隔符
在项目中我们经常会遇到 Golang
默认模板变量分隔符号与 Vue
的变量分隔符号冲突的情况(都使用的是 {{ }}
),我们可以使用 SetDelimiters
方法来自定义全局的 Golang
模板变量分隔符号:
// 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: ${.}
执行后,输出结果为:
<nil>
test.tpl content, vars: map[k:v]
目录配置方法
GoFrame
框架的模板引擎支持非常灵活的多目录自动搜索功能,通过 SetPath
可以修改模板目录为唯一的一个目录地址,同时,我们可以通过 AddPath
方法添加多个搜索目录,模板引擎底层将会按照添加目录的顺序作为优先级进行自动检索。直到检索到一个匹配的文件路径为止,如果在所有搜索目录下查找不到模板文件,那么会返回失败。
默认目录配置:
gview
视图对象初始化时,默认会自动添加以下模板文件搜索目录:
- 当前工作目录及其下的
template
目录:例如当前的工作目录为/home/www
时,将会添加/home/www
及/home/www/template
; - 当前可执行文件所在目录及其下的
template
目录:例如二进制文件所在目录为/tmp
时,将会添加/tmp
及/tmp/template
; - 当前
main
源代码包所在目录及其下的template
目录(仅对源码开发环境有效):例如main
包所在目录为/home/john/workspace/gf-app
时,将会添加/home/john/workspace/gf-app
及/home/john/workspace/gf-app/template
;
修改模板目录
我们可以通过以下方式修改视图对象的模板文件搜索目录,视图对象将会只在该指定目录执行配置文件检索:
- (推荐)单例模式获取全局View对象,通过
SetPath
方法手动修改; - 修改命令行启动参数 -
gf.gview.path
; - 修改指定的环境变量 -
GF_GVIEW_PATH
;
例如,我们的执行程序文件为 main
,那么可以通过以下方式修改模板引擎的模板目录(Linux下):
- (推荐)通过单例模式
g.View().SetPath("/opt/template")
- 通过命令行参数
./main --gf.gview.path=/opt/template/
- 通过环境变量
-
启动时修改环境变量:
GF_GVIEW_PATH=/opt/config/; ./main
-
使用
genv
模块来修改环境变量:genv.Set("GF_GVIEW_PATH", "/opt/template")
-
自动检测更新
模板引擎使用了精心设计的 缓存机制,当模板文件第一次被读取后会被缓存到内存,下一次读取时将会直接从缓存中获取,以提高执行效率。并且,模板引擎提供了对模板文件的 自动检测更新机制,当模板文件在外部被修改后,模板引擎能够即时地监控到并刷新模板文件的缓存内容。
相关文档
📄️ 模板引擎-模板配置
GoFrame框架的视图组件是核心之一,支持便捷的配置管理。本文详细介绍了通过配置文件管理视图组件的方式,包括配置项定义和示例。同时介绍了如何使用SetConfigWithMap方法进行特定配置的设置,确保模板解析的正常进行。
📄️ 模板引擎-模板标签
GoFrame框架中的模板引擎与模板标签基本用法,包括如何自定义模板闭合标签,使用pipeline在模板中传递数据,条件语句if...else的使用,range用于迭代slice、map等类型,使用define定义模板块,template标签结合define实现模板嵌套和复用,以及include标签在GoFrame框架中的使用差异。
📄️ 模板引擎-模板变量
模板引擎中如何使用自定义对象作为模板变量,并在模板中访问对象的属性和调用方法。通过示例,详细说明了如何在GoFrame框架中实现模板内容解析,以及对象指针和对象变量的使用区别与方法调用规则,帮助开发者更好地掌握GoFrame框架中的模板技术。
📄️ 模板引擎-模板布局
GoFrame框架中的gview模板引擎的layout模板布局方式。gview支持两种布局方式:通过define和template标签进行内容块管理,以及通过include标签进行模板嵌入。这两种方式均支持模板变量的传递。示例代码演示了如何在GoFrame框架中使用这些模板引擎技术。
📄️ 模板引擎-XSS处理
在使用GoFrame框架的模板引擎时进行XSS处理。默认情况下,输出变量未进行HTML转码,可能导致XSS漏洞,但GoFrame框架提供了灵活的配置参数,通过AutoEncode或SetAutoEncode方法控制转义效果,以增强输出安全性。
📄️ 模板引擎-其他使用
在GoFrame框架中使用模板引擎的不同功能,包括支持I18N特性及在Http对象和控制器中的实现。通过示例代码,我们展示了模板解析语法和在多线程环境下的数据隔离管理。也包含了不推荐的控制器注册方式的使用注意事项。
🗃️ 模板引擎-模板函数
3 个项目