iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 17
0
Modern Web

BeeGo系列 第 17

訊息顯示

  • 分享至 

  • xImage
  •  

前面有使用塞變數的方法來顯示訊息,但這樣做,變成每個 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 設置訊息時,這個頁面就得使用 beego.ReadFromRequest(&c.Controller)。
  • 確定這個頁面開始才會有 flash 訊息時,那麼這個頁面就該使用 beego.NewFlash()

第二個缺點是 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 上。

參考文件


上一篇
Middleware / Filter(2)
下一篇
Multiple language
系列文
BeeGo30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言