テンプレート
Context#Render(code int, name string, data any) error はデータでテンプレートをレンダリングし、
ステータスコード付きの text/html レスポンスを送信します。Echo#Renderer を設定して
renderer を登録すると、任意のテンプレートエンジンを使えます。
レンダリング
Section titled “レンダリング”次の例では Go の html/template を使います。
デフォルトのテンプレート renderer を使います。
e.Renderer = &echo.TemplateRenderer{ Template: template.Must(template.New("hello").Parse("Hello, {{.}}!")),}または echo.Renderer インターフェイスを自分で実装します。
type Template struct { templates *template.Template}
func (t *Template) Render(c *echo.Context, w io.Writer, name string, data any) error { return t.templates.ExecuteTemplate(w, name, data)}-
テンプレートを事前コンパイルします。
public/views/hello.html:{{define "hello"}}Hello, {{.}}!{{end}}t := &Template{templates: template.Must(template.ParseGlob("public/views/*.html")),} -
renderer を登録します。
e := echo.New()e.Renderer = te.GET("/hello", Hello) -
ハンドラ内でテンプレートをレンダリングします。
func Hello(c *echo.Context) error {return c.Render(http.StatusOK, "hello", "World")}
応用:テンプレートから Echo を呼び出す
Section titled “応用:テンプレートから Echo を呼び出す”テンプレート内から Echo#Reverse を呼び出して URI を生成したい場合があります。
Go の html/template はこれに最適というわけではありませんが、2 つの方法で実現できます。
テンプレートに渡すすべてのオブジェクトに共通メソッドを用意するか、map[string]any を渡して
カスタム renderer 内で拡張する方法です。後者の方が柔軟です。完全な例を示します。
template.html:
<html><body><h1>Hello {{index . "name"}}</h1>
<p>{{ with $x := index . "reverse" }} {{ call $x "foobar" }} <!--- this calls $x with the parameter "foobar" --> {{ end }}</p></body></html>server.go:
package main
import ( "html/template" "io" "net/http"
"github.com/labstack/echo/v5")
// TemplateRenderer is a custom html/template renderer for Echo.type TemplateRenderer struct { templates *template.Template}
// Render renders a template document.func (t *TemplateRenderer) Render(c *echo.Context, w io.Writer, name string, data any) error { // Add global methods if the data is a map. if viewContext, isMap := data.(map[string]any); isMap { viewContext["reverse"] = c.RouteInfo().Reverse }
return t.templates.ExecuteTemplate(w, name, data)}
func main() { e := echo.New() e.Renderer = &TemplateRenderer{ templates: template.Must(template.ParseGlob("main/*.html")), }
e.GET("/something/:name", func(c *echo.Context) error { return c.Render(http.StatusOK, "template.html", map[string]any{ "name": "Dolly!", }) })
if err := e.Start(":1323"); err != nil { e.Logger.Error("shutting down the server", "error", err) }}