前に勢いで書いちゃった ksatriya(こちら をご参照ください)、自分で使うにあたってちょっと機能追加したくなったので追加した。
追加した機能
結果として、
- before / after hook を controller ごとに定義可能
- HTML をレンダリングする際にベースとなるテンプレートを controller ごとに定義可能
になった。
手を動かす前は「これくらい簡単やろ〜」と思っていた。でも、これだけをやるために結構いろんな学びがあったし、実際、コードもかなり改修した。
あと、せっかくなので https://github.com/unrolled/render に頼っていたレンダリング部分も自前で実装してみた。結果、標準パッケージ以外への依存が 1 つ減って幸せになれた。
使い方
現状の ksatriya を使ったサンプルアプリケーションは ここ に置いてあるけれど、今後も仕様は変わっていくと思うので、現状の ksatriya.Controller
の使い方だけ以下にメモしておこうと思う。後で見なおして思い出に浸ったりしたい。
まず、ksatriya.Controller
を埋め込んだ Controller
を定義する
import (
"net/http"
"github.com/m0t0k1ch1/ksatriya"
)
type Controller struct {
*ksatriya.Controller
}
func NewController() *Controller {
c := &Controller{ksatriya.NewController()}
c.AddBeforeFilter(c.Before) // add before hook
c.AddAfterFilter(c.After) // add after hook
c.GET("/", c.Index)
c.GET("/user/:name", c.User)
return c
}
func (c *Controller) Before(ctx *ksatriya.Context) {
ctx.SetTmplDirPath("app/view")
ctx.SetBaseTmplPath("layout.html") // set base template
}
func (c *Controller) After(ctx *ksatriya.Context) {
ctx.RenderArgs["title"] = "ksatriya-sample"
}
func (c *Controller) Index(ctx *ksatriya.Context) {
ctx.HTML(http.StatusOK, "index.html", nil)
}
func (c *Controller) User(ctx *ksatriya.Context) {
name := ctx.Param("name")
ctx.HTML(http.StatusOK, "user.html", ksatriya.RenderArgs{
"name": name,
})
}
で、以下のようにする。
k := ksatriya.New()
k.RegisterController(NewController())
k.Run(":8080")
以上。
今後
自分がほしいな〜と思っていた最低限の機能は揃った気がするので、そろそろテストを書いていきたい。
ちょっと tiny とは言えなくなってきたこともあって週末にテスト書いたりしたいけど、どうせ例の Gunosy のやつの後に全部書き直したくなる気がするので我慢
— m0t0k1ch1.eth (@m0t0k1ch1) September 5, 2014
「例の Gunosy のやつ」っていうのは こちら。楽しみ。