Martiniの素晴らしいGo WEBフレームワーク
他のフレームに見られるのは、従来のOOPの影であり、ClassスタイルのOOPをあちこちでエッチングする方法であることが知られている.GoLangにはClassがないことを知っています筆者もGoのスタイルでWEB開発をしようと努力したが、どうも力不足だった.書き出したコードを完全にフレームワークと呼ぶことができず、ソースコードをコピーするためのアプリケーションに似ている.柔軟性を達成するにはソースコードを修正する必要がある.マーティンが見えるまで純粋なGoLangスタイルのフレームワークが登場しました.
コアプロジェクト
コアプロジェクト
InjectorはMartiniの核心です.そのコードは非常に簡潔である.機能は、パケットを反射するだけで、関数のパラメータタイプの自動マッチングを呼び出す.筆者はかつて類似の機能を完成するためにtypelessを書いたが、これは煩雑で高コストの実験品である.Injectorは事を簡単化し、Injectorは関数のパラメータが異なるタイプを持っていると仮定した.WEB開発におけるHandlerFuncは、通常、このような形式を有する.したがって、反射パケットによってパラメータを自動的に整合するHandlerFuncを呼び出すことができ、当然、事前に使用可能なすべてのパラメータMap/MapToをInjectorオブジェクトに与えることは容易であり、予見可能である.
シンプルなルーティング設計
マーティンのルートgoの書くのは非常に簡潔で実用的で、作者が正則を使う功力が非常に深いことを見ることができる.例:
“/wap/:category/pow/**/:id”
一致:"/wap/Golang/pow/Path 1/ToPathN/Foo"
フレキシブルミドルウェア
ここでのミドルウェアとは、一般に、アプリケーションのニーズにおけるプロセス制御、前処理、フィルタ、キャプチャpanic、ログなどを指す.これらは依然としてInjectorが背後に動力を提供する.
ソースコードのClassicMartiniの例を挙げると、もちろん必要に応じて真似することができます.<!-- lang: cpp -->
func Classic() *ClassicMartini {
r := NewRouter()
m := New() //
m.Use(Logger()) //
m.Use(Recovery()) // panic
m.Use(Static("public")) //
m.Action(r.Handle) //
return &ClassicMartini{m, r}
}
その中でRecovery()とfunc(r*routeContext)run()の組み合わせの方法は非常に読む価値があり、簡単なカウンタで完成した.
martini-contribのwebパッケージはMartiniを通過する方法を示している.Useインタフェースはミドルウェアの設計を行う.新しいHandlerFuncパラメータの種類を加えるのはMapによって完成した.
もし我々がResponseプロセスの制御を完了するならば、ある条件がUseとActionの設定を中断するHandlerに達しない.それは簡単にUseを通じて自分のRecoveryに参加してHandlerを判断して実現することができます<!-- lang: cpp -->
func Recovery() Handler {
return func(res http.ResponseWriter, c Context, logger *log.Logger) {
defer func() {
if err := recover(); err != nil {
s, ok := err.(string) // string,
if ok && s == "dont ServerError" {
return
}
res.WriteHeader(http.StatusInternalServerError)
logger.Printf("PANIC: %s
%s", err, debug.Stack())
}
}()
c.Next()
}
}
func MyHandler() Handler {
return func(req *http.Request) {
if something {
panic("dont ServerError")
}
}
}
m.Use(Recovery())
m.Use(MyHandler())
さらに<!-- lang: cpp -->
// Handlers
m.Get("/", func() string {
return "hello world" // HTTP 200 : "hello world"
})
// handlers
db := &MyDatabase{}
m := martini.Classic()
m.Map(db) // the service will be available to all handlers as *MyDatabase
// ...
m.Run()
変化と自由度が非常に高い.マーティンが紹介したように
Martini is a powerful package for quickly writing modular web applications/services in Golang.
martiniは素晴らしいwebフレームワークで、驚くほど簡単で、想像しがたい効率です.
はい、これこそ本当のGoLangスタイルです.
Martiniコミュニティコンポーネント
開発者はmartini-contrib組織を設立した.このような管理方式はより開放的である.実際にはこのようにMartini Injectorの風格に合致し、コンポーネント間の依存はInjectorのMap/Invoke機構によって完成することができる.
マーティンのルートgoの書くのは非常に簡潔で実用的で、作者が正則を使う功力が非常に深いことを見ることができる.例:
“/wap/:category/pow/**/:id”
一致:"/wap/Golang/pow/Path 1/ToPathN/Foo"
フレキシブルミドルウェア
ここでのミドルウェアとは、一般に、アプリケーションのニーズにおけるプロセス制御、前処理、フィルタ、キャプチャpanic、ログなどを指す.これらは依然としてInjectorが背後に動力を提供する.
ソースコードのClassicMartiniの例を挙げると、もちろん必要に応じて真似することができます.<!-- lang: cpp -->
func Classic() *ClassicMartini {
r := NewRouter()
m := New() //
m.Use(Logger()) //
m.Use(Recovery()) // panic
m.Use(Static("public")) //
m.Action(r.Handle) //
return &ClassicMartini{m, r}
}
その中でRecovery()とfunc(r*routeContext)run()の組み合わせの方法は非常に読む価値があり、簡単なカウンタで完成した.
martini-contribのwebパッケージはMartiniを通過する方法を示している.Useインタフェースはミドルウェアの設計を行う.新しいHandlerFuncパラメータの種類を加えるのはMapによって完成した.
もし我々がResponseプロセスの制御を完了するならば、ある条件がUseとActionの設定を中断するHandlerに達しない.それは簡単にUseを通じて自分のRecoveryに参加してHandlerを判断して実現することができます<!-- lang: cpp -->
func Recovery() Handler {
return func(res http.ResponseWriter, c Context, logger *log.Logger) {
defer func() {
if err := recover(); err != nil {
s, ok := err.(string) // string,
if ok && s == "dont ServerError" {
return
}
res.WriteHeader(http.StatusInternalServerError)
logger.Printf("PANIC: %s
%s", err, debug.Stack())
}
}()
c.Next()
}
}
func MyHandler() Handler {
return func(req *http.Request) {
if something {
panic("dont ServerError")
}
}
}
m.Use(Recovery())
m.Use(MyHandler())
さらに<!-- lang: cpp -->
// Handlers
m.Get("/", func() string {
return "hello world" // HTTP 200 : "hello world"
})
// handlers
db := &MyDatabase{}
m := martini.Classic()
m.Map(db) // the service will be available to all handlers as *MyDatabase
// ...
m.Run()
変化と自由度が非常に高い.マーティンが紹介したように
Martini is a powerful package for quickly writing modular web applications/services in Golang.
martiniは素晴らしいwebフレームワークで、驚くほど簡単で、想像しがたい効率です.
はい、これこそ本当のGoLangスタイルです.
Martiniコミュニティコンポーネント
開発者はmartini-contrib組織を設立した.このような管理方式はより開放的である.実際にはこのようにMartini Injectorの風格に合致し、コンポーネント間の依存はInjectorのMap/Invoke機構によって完成することができる.
<!-- lang: cpp -->
func Classic() *ClassicMartini {
r := NewRouter()
m := New() //
m.Use(Logger()) //
m.Use(Recovery()) // panic
m.Use(Static("public")) //
m.Action(r.Handle) //
return &ClassicMartini{m, r}
}
<!-- lang: cpp -->
func Recovery() Handler {
return func(res http.ResponseWriter, c Context, logger *log.Logger) {
defer func() {
if err := recover(); err != nil {
s, ok := err.(string) // string,
if ok && s == "dont ServerError" {
return
}
res.WriteHeader(http.StatusInternalServerError)
logger.Printf("PANIC: %s
%s", err, debug.Stack())
}
}()
c.Next()
}
}
func MyHandler() Handler {
return func(req *http.Request) {
if something {
panic("dont ServerError")
}
}
}
m.Use(Recovery())
m.Use(MyHandler())
<!-- lang: cpp -->
// Handlers
m.Get("/", func() string {
return "hello world" // HTTP 200 : "hello world"
})
// handlers
db := &MyDatabase{}
m := martini.Classic()
m.Map(db) // the service will be available to all handlers as *MyDatabase
// ...
m.Run()
開発者はmartini-contrib組織を設立した.このような管理方式はより開放的である.実際にはこのようにMartini Injectorの風格に合致し、コンポーネント間の依存はInjectorのMap/Invoke機構によって完成することができる.