前面有使用塞變數的方法來顯示訊息,但這樣做,變成每個 Controller 都要寫重複的程式,有沒有類似 Django Message framework 的方法呢?
有喔,BeeGo 有 Flash Messages。
BeeGo 已經預先埋入了 Flash messages 機制,就類似 Django Message framework 一樣。
在 Controller 的方法裡使用的起手式是先用 beego.NewFlash() 建立 Flash 物件,然後使用 Store 與 Controller 做連結。
func (c *YourController) Get() {
flash := beego.NewFlash()
// ...flash operations...
flash.Store(&c.Controller)
// ...其他程式...
}
接著就可以使用 Error(), Warning(), Notice(), Success(), Set() 等方法來設定要顯示的訊息了。
Error() 是用來設定要顯示的錯誤訊息。
Warning() 是用來設定要顯示的警告訊息。
Notice() 是用來設定要顯示的提示。
Success() 是用來設定要顯示的成功訊息。
Set() 是一個特例,讓開發者可以指定一個任意的訊息名稱。
flash := beego.NewFlash()
flash.Success("Login successed!")
flash.Error("Login failed.")
Template 那邊要顯示,可以直接引用 .flash
{{ if .flash.error}}
<div class="alert alert-danger" role="alert">
{{.flash.error}}
</div>
{{ end }}
{{ if .flash.success}}
<div class="alert alert-success" role="alert">
{{.flash.success}}
</div>
{{ end }}
讀取先前設置的 flash message 的話,得使用 ReadFromRequest
func (c *YourController) Get() {
flash := beego.ReadFromRequest(&c.Controller)
// ...省略...
flash.Store(&c.Controller)
}
最主要的運作,是在於 flash.Store()
flash.Store() 裡,主要是將資料組成指定字串後,放置到 Cookie 裡。
而 beego.ReadFromRequest() 則是讀取 Cookie,並解析、還原,再放到 Controller 的 Data["flash"] 裡。
經過一番測試,大致上可以使用,但是有其缺點。
第一個缺點是使用上仍然要自己去處理使用 flash 的時機:
第二個缺點是 flash.Store(),這個 flash.Store() 必須要擺在使用 flash.Success(), flash.Error()... 等方法之後,因為 flash.Store() 才是真正把訊息放到 cookie 裡的函式。
在 Django 裡,message framework 是一個 middleware,Store 與 ReadFromRequest 的處理在離開/進入 Controller 之前,就已經處理好了,使用者不需要費心。
我認為 BeeGo 應該將這部份改寫為 BeeGo Filter 會更好些,開發者就不需要費心處理 Store/ReadFromRequest 的呼叫。
閱讀 Flash messages 以後,我也修改了程式,改用 flash messages 來處理,程式碼在 github 上。