模板
渲染
在处理器函数中,可以使用上下文方法 Context#Render(code int, name string, data any) error
将我们的模板文件渲染成 HTML 代码并响应给客户端。
但在此之前,我们必须通过设置 Slim 实例的属性 Slim#Renderer
注册模板引擎。
Slim 允许我们使用任何模板引擎实现模板的渲染功能,只需要实现如下接口即可:
模板引擎接口
type Renderer interface {
Render(c slim.Context, w io.Writer, name string, data any) error
}
下面示例展示如何使用 Go 标准库的 html/template 包实现模板引擎:
-
实现接口
slim.Renderer
实现模板引擎type Template struct {
templates *template.Template
}
func (t *Template) Render(c slim.Context, w io.Writer, name string, data any) error {
return t.templates.ExecuteTemplate(w, name, data)
} -
预编译模板
views/hello.html{{define "hello"}}Hello, {{.}}!{{end}}
预 编译模板t := &Template{
templates: template.Must(template.ParseGlob("views/*.html")),
} -
注册模板
注册模板s := slim.New()
s.Renderer = t
s.GET("/hello", Hello) -
在处理程序中呈现模板
渲染模板func Hello(c slim.Context) error {
return c.Render(http.StatusOK, "hello", "World")
}
增强
在某些情况下,从模板生成 URI 可能很有用。为此,您需要从模板本身调用。而 Golang 的标准库 html/template 不适合这项工作的, 但这可以通过两种方式完成:在传递给模板的所有对象上提供通用方法,或者在自定义渲染器中传递和增强此对象。 鉴于后一种方法的灵活性,下面是一个示例程序:
template.html
<html>
<body>
<h1>Hello {{index . "name"}}</h1>
<p>{{ with $x := index . "reverse" }}
{{ call $x "foobar" }} <-- this will call the $x with parameter "foobar"
{{ end }}
</p>
</body>
</html>
我们的服务器代码:
server.go
package main
import (
"html/template"
"io"
"net/http"
"zestack.dev/slim"
)
// TemplateRenderer is a custom html/template renderer for Echo framework
type TemplateRenderer struct {
templates *template.Template
}
// Render renders a template document
func (t *TemplateRenderer) Render(c slim.Context, w io.Writer, name string, data interface{}) error {
// Add global methods if data is a map
if viewContext, isMap := data.(map[string]interface{}); isMap {
viewContext["reverse"] = c.Slim().Reverse
}
return t.templates.ExecuteTemplate(w, name, data)
}
func main() {
s := slim.New()
renderer := &TemplateRenderer{
templates: template.Must(template.ParseGlob("*.html")),
}
s.Renderer = renderer
// Named route "foobar"
s.GET("/something", func(c slim.Context) error {
return c.Render(http.StatusOK, "template.html", map[string]any{
"name": "Dolly!",
})
}).Name = "foobar"
s.Logger.Fatal(s.Start(":8000"))
}