對laravel5概念的理解 -- 觀察者模式(Event)
阿新 • • 發佈:2019-01-30
官方給的tutorial完全把我搞混了,command bus queue的例子中使用了event事件,而event事件中又有事件佇列。然後小白搞不懂兩者區別了,最後結論麼,兩者根本沒關係。
event事件其實就是觀察者模式的實現,簡單來說先定義一個事件,然後定義1個或多個監聽器來監聽這個事件,一旦事件發生,監聽器都會做出相應的邏輯處理。比如有個事件發生:股票漲了,有2個監聽器(分別是媒體,股民)都立即做出反應,媒體立馬釋出股票漲了的新聞,股民立馬拋售或增持。
具體實現是:
在EventServiceProvider中註冊監聽事件和監聽器,又看到service provider了,看下它原始碼:
請忽略我給register寫的註釋,EventSevericeProvider在該方法中沒有相應邏輯,我只是突然想到了其他ServiceProvider有用到該方法所以寫了點筆記。 另外,還有2個概念我當初有點搞混,既然可以繫結多個監聽器到一個監聽時間上,那還搞個事件訂閱者幹什麼。後來看看官網給的UserEventListener的例子,想想應該是這麼回事。 比如使用者登入、登出其實都是使用者的行為,假設使用$listen陣列去註冊的話,就要寫2個監聽器類,程式碼太冗餘,但用事件訂閱者,就只要寫一個類,最後把使用者行為在subscribe方法中統一繫結,看原始碼就發現註冊形式和寫在$listen陣列的格式差不多,
而$listen陣列是這樣的,
證實了我之前的猜想,如果寫在$listen陣列中就要寫2遍了。 最後關於事件佇列(queue),事件分發器Dispatcher有兩種處理方式, 1)sync方式,顧名思義,監聽器多或者監聽器執行事件長,會造成阻塞
2)push到佇列中,由background執行
請忽略我給register寫的註釋,EventSevericeProvider在該方法中沒有相應邏輯,我只是突然想到了其他ServiceProvider有用到該方法所以寫了點筆記。 另外,還有2個概念我當初有點搞混,既然可以繫結多個監聽器到一個監聽時間上,那還搞個事件訂閱者幹什麼。後來看看官網給的UserEventListener的例子,想想應該是這麼回事。 比如使用者登入、登出其實都是使用者的行為,假設使用$listen陣列去註冊的話,就要寫2個監聽器類,程式碼太冗餘,但用事件訂閱者,就只要寫一個類,最後把使用者行為在subscribe方法中統一繫結,看原始碼就發現註冊形式和寫在$listen陣列的格式差不多,
而$listen陣列是這樣的,
證實了我之前的猜想,如果寫在$listen陣列中就要寫2遍了。 最後關於事件佇列(queue),事件分發器Dispatcher有兩種處理方式, 1)sync方式,顧名思義,監聽器多或者監聽器執行事件長,會造成阻塞
2)push到佇列中,由background執行