一種是所有的路由都掛載到根路徑 『/』 上邊,舉例說明,如果有乙個登入和登出功能,我們可以這麼來寫
router.get("/user/login", loginhandler)
router.get("/user/logout", logouthandler)
當然這也是最為直觀和容易理解的方式。
另一種是將有共通路徑字首的路由集合在一塊,例如按照gin的寫法:
user := route.group("/user")
當然各有各的好處了, 這種方式的方便之處在於,如果要對 「/user」 字首的路由統一做處理(比如增加鑑權功能),就只需要在最上層加上處理邏輯,無需對每乙個路由重複新增。尤其是在gin裡邊,搭配後邊會介紹的中介軟體一塊使用,會顯得更為方便。
接下來就介紹gin裡邊如何實現的這一功能。同時我們慢慢的構建乙個框架應該有的樣子。
使用框架的目的是什麼,我的理解是隱藏重複和底層的細節,使其作為乙個可重複的抽象,讓開發更為快速和便捷。前兩篇都是直接用乙個檔案搭建了web服務,現在我們開始真正的做乙個抽象。
engine struct
假設我們已經完成了這個 engine, 我們需要乙個啟動函式
func (engine *engine) run(addr string)
servehttp(responsewriter, *request)
所以只要 engine 也實現了這個函式,就能作為第二個引數了,那我們就實現乙個。
func (engine *engine) servehttp(w http.responsewriter, req *http.request)也是很簡單,只是呼叫了 engine裡邊 httprouter.router 的 servehttp。
我們已經有了啟動函式,接下去看看初始化的過程。先看engine中routergroup的定義
// handlerfunc .
handlerfunc func(*context)
// context .
context struct
// routergroup .
routergroup struct
這邊定義了乙個context,這個是gin中最重要的資料結構之一。它把request的req、write以及params都包在了裡邊。所以初始化的過程也就明確了
}接下去定義group的時候,建立乙個新的 routergroup
// group .
func (group *routergroup) group(component string) *routergroup
}
然後呼叫
user.get("/login", loginhandler)
的時候需要把對應的loginhandler加入到router的路由配置中
// get is a shortcut for router.handle("get", path, handle)
func (group *routergroup) get(path string, handler handlerfunc)
// handle .
func (group *routergroup) handle(method, p string, handler handlerfunc) )
}func (c *context) next()
從上邊的**可以看出, user.get 實際上就是先把routergroup的字首路徑組合起來,然後將對應的路徑和handler加入到httprouter裡邊。
同樣的,類似get方法的處理, 我們能定義其他的比如post、delete的方法實現:
}具體的**實現可以參見github:
仿Gin搭建自己的web框架 二
本文介紹gin的路由控制。複製 這條語句通過http.handlefunc函式註冊了對路徑 處理的函式handler。看一下它內部的實現 func handlefunc pattern string,handler func responsewriter,request 複製 可以看到是呼叫了 de...
搭建自己的PHP框架心得(一)
說到寫php的mvc框架,大家想到的第乙個詞 造輪子 是的,乙個還沒有深厚功力的程式設計師,寫出的php框架肯定不如那些出自大神們之手 經過時間和各種專案考驗的框架。但我還是準備並且這麼做了,主要是因為 所以說,這次造輪子的目的不是為了造輪子而是為了在造輪子的過程中熟悉其工藝,總結輪子特點,更好的使...
搭建自己的PHP框架心得(一)
body blog calendar p,blockquote,ul,ol,dl,table,pre h1,h2,h3,h4,h5,h6 h1 tt,h1 code,h2 tt,h2 code,h3 tt,h3 code,h4 tt,h4 code,h5 tt,h5 code,h6 tt,h6 co...