摘要:一個事件系統就這么簡單。說了這么多,一句話概括事件系統就像是框架層的全局數據庫,具有存儲注冊和觸發事件功能,解耦代碼,實現跨組件通信。。
我們知道,laravel/symfony 框架是由一堆堆 components 組件粘合在一起的。其中會有一個 event component 組件,比較特殊,它像一個中介,是框架層全局 component,專門負責不同component間相互通信傳數據的。
說它是全局的,意思是,整個請求生命周期內,event 對象是單例的,對象不能新建實例,每次從容器中獲取標識為 "event" 的 event 對象還是最開始的 event 對象,為啥要這樣搞?很簡單啊,如果不是單例的,那第一個 event component 里注冊了 10 個事件 event,在某個 component 里想要觸發 event 對象里的一個發郵件事件 "mail",但如果此時從容器中拿到的 event component 不是原來的 event component,那就找不到那個 mail 事件對應的處理器 handler 了。可以看看 laravel 的 EventServiceProvider 在往容器中注冊 "event" 對象時是使用的 singleton() 單例注冊的,這樣保證 event 對象永遠是那一個。
說它負責跨組件通信,意思是比如對于 database 下的一個 model 對象如 account model,當邏輯處理到 save 完一個 account model 到數據庫時,如果需要再增加幾個邏輯,如發個郵件 mail,數據入數據庫前需要驗證 validation,給這個 account 寫個日志 log 等等,這幾個邏輯需要 Mail Component/Validation Component/Log Component 里面的對象去處理,難道我要在 $account->save() 的后面在寫一大坨這些邏輯?那代碼豈不亂七八糟。何況我想在 save 前和 save 后再搞一些邏輯,那不完蛋了。有沒有這樣一種實踐方式讓我 save 前一兩行代碼,save 后一兩行代碼,把這些邏輯解耦為各個小邏輯呢,這樣代碼豈不更清爽。
(1) 為啥需要事件系統?
代碼層面,為了代碼解耦,把在一處的一大坨邏輯解耦成多處細分代碼;性能考慮,事件的隊列功能模擬了異步處理,把耗時的任務放在隊列里,讓隊列一個個去慢慢處理這些任務。
(2) 事件架構是如何構成的?
事件架構其實很簡單,它是一個框架層的全局 component: event component,通過上面的描述知道它應該具備幾個功能: 事件注冊功能,事件觸發功能,再加一個高級功能把事件放在隊列里異步處理,如 laravel 里事件注冊功能IlluminateEventsDispatcher::listen(),事件觸發功能IlluminateEventsDispatcher::dispatch()。
一個事件系統就這么簡單。
(3) 一個事件 event 可以有多個處理器 handler/listener,一個 handler/listener 可以監聽多個事件,這個應該如何讓 event component 支持呢?
要求多個 handler/listener (一個 callable 或是一個 class name)監聽一個事件 "event",很簡單,那就多次注冊IlluminateEventsDispatcher::listen($event_name, $handler),$event_name 一樣,$handler 不一樣而已,會按照注冊順序執行 $handler,當然 symfony 支持在第三個參數就是 priority,設置 $handler 執行順序。
要求一個 handler/listener 可以監聽多個 event,很簡單,把 handler 做成一個類 class,然后里面做個 $events 數組屬性設置要監聽哪些 events 就行,laravel/symfony 都叫這個 handler 為 Event Subscribers,僅此而已。
不想去畫圖來詳細說明了,根據上面幾句話,再去從架構層面去看 laravel event / symfony event 的事件系統文章,就很簡單了,建議仔細閱讀下官網這兩篇文章。其他細節都是為了上面這些設計目的服務的。
說了這么多,一句話概括:事件系統就像是框架層的全局數據庫,具有存儲、注冊和觸發事件功能,解耦代碼,實現跨組件通信。。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/26311.html
摘要:測試運行多次并取平均值。文章數量測試的基準測試基準測試結果基準測試結果基準測試結果基準測試結果基準測試結果基準測試結果不支持再次成為冠軍請注意的運行環境需要或以上。同時,再次不能正常工作并拋出錯誤。 showImg(https://segmentfault.com/img/remote/1460000013690286); 我們每年都會嘗試深入了解不同版本的 PHP 和 HHVM 在各...
摘要:首先你應該是在用以上的版本,如果版本在這之下,是時候該升級了。按照其官網的說法,這個組織的目的并不是告訴你你應該怎么做,只是一些主流的框架之間相互協商和約定。和沒有出現在以上的列表中,是因為還沒有投票通過。不要被這些話所困擾。 首先你應該是在用 PHP 5.3 以上的版本,如果 PHP 版本在這之下,是時候該升級了。我建議如果有條件,最好使用最新的版本。 你應該看過 PHP The R...
摘要:框架組件化改造框架從單體應用到組件化改造的架構升級之路經過一年多的開發框架功能越來越完善也越來越復雜初創時期的單體應用已經無法支撐項目的快速發展于是開發組在年前為版制定了組件化改造的重構方案內容速覽組件化原理包管理基礎知識組件化方案來 date: 2018-3-21 13:22:16title: Swoft| Swoft 框架組件化改造description: Swoft 框架從單體應...
摘要:在年我參加兄弟連的培訓,成為一名程序員。我認為成為程序員的有以下三種途徑。為大家準備了一份年程序員發展路線。可見也可以關注下上個時代框架霸主他的新版本可能會有奇跡發生擴展異步編程框架這個就不必多說了。 showImg(https://segmentfault.com/img/bVbmMdM?w=640&h=364); 我一生的文章都會放在這里,我的博客,我希望每一行代碼,每一段文字都能...
摘要:我最近在給完善說明文檔有一節是性能測試比較才有了下面這個項目項目托管地址針對上比較活躍的幾個開源項目,做了簡單的比較。供大家參考所有框架僅輸出就僅測試框架的本身的性能。如果有精力可以測下帶有數據庫交互的測試。祝國內產生更多優秀的開源產品 我最近在給tastphp 完善說明文檔 有一節是性能測試比較 ,才有了下面這個項目 項目托管地址: https://github.com/xujiaj...
閱讀 3332·2023-04-25 16:25
閱讀 3861·2021-11-15 18:01
閱讀 1620·2021-09-10 11:21
閱讀 3030·2021-08-02 16:53
閱讀 3094·2019-08-30 15:55
閱讀 2499·2019-08-29 16:24
閱讀 2112·2019-08-29 13:14
閱讀 1050·2019-08-29 13:00