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