模板

模板渲染

Context#Render(code int, name string, data interface{}) error 用于渲染一个模板,然后发送一个 text/html 的状态响应。我们可以使用任何模板引擎,只要赋值给 Echo.Renderer

下面是使用Go html/template 的示例:

1.实现 echo.Renderer 接口

  1. type Template struct {
  2. templates *template.Template
  3. }
  4. func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
  5. return t.templates.ExecuteTemplate(w, name, data)
  6. }

2.预编译模板

public/views/hello.html

  1. {{define "hello"}}Hello, {{.}}!{{end}}
  1. t := &Template{
  2. templates: template.Must(template.ParseGlob("public/views/*.html")),
  3. }

3.注册模板

  1. e := echo.New()
  2. e.Renderer = t
  3. e.GET("/hello", Hello)

4.在 action 中渲染模板

  1. func Hello(c echo.Context) error {
  2. return c.Render(http.StatusOK, "hello", "World")
  3. }

高级 - 在模版中调用 Echo

在某些情况下可能需要从模版生成 uri。这样你需要在模版中调用 Echo#Reverse。Golang 的 html/template 包不太适合于这种情况,但是我们可以通过两种方法实现它:给所有的传递到模版的对象提供一个公用的方法或者将 map[string]interface{} 作为参数传递给自定义模版。
下面的代码展示后者的处理方式:
template.html

  1. <html>
  2. <body>
  3. <h1>Hello {{index . "name"}}</h1>
  4. <p>{{ with $x := index . "reverse" }}
  5. {{ call $x "foobar" }} &lt;-- this will call the $x with parameter "foobar"
  6. {{ end }}
  7. </p>
  8. </body>
  9. </html>

server.go

  1. package main
  2. import (
  3. "html/template"
  4. "io"
  5. "log"
  6. "net/http"
  7. "github.com/labstack/echo"
  8. )
  9. // TemplateRenderer is a custom html/template renderer for Echo framework
  10. type TemplateRenderer struct {
  11. templates *template.Template
  12. }
  13. // Render renders a template document
  14. func (t *TemplateRenderer) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
  15. // Add global methods if data is a map
  16. if viewContext, isMap := data.(map[string]interface{}); isMap {
  17. viewContext["reverse"] = c.Echo().Reverse
  18. }
  19. return t.templates.ExecuteTemplate(w, name, data)
  20. }
  21. func main() {
  22. e := echo.New()
  23. renderer := &TemplateRenderer{
  24. templates: template.Must(template.ParseGlob("*.html")),
  25. }
  26. e.Renderer = renderer
  27. // Named route "foobar"
  28. e.GET("/something", func(c echo.Context) error {
  29. return c.Render(http.StatusOK, "something.html", map[string]interface{}{
  30. "name": "Dolly!",
  31. })
  32. }).Name = "foobar"
  33. log.Fatal(e.Start(":8000"))
  34. }