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