EventDispatcher事件分發(fā)組件是怎樣的,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
在天門等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、成都網(wǎng)站設(shè)計 網(wǎng)站設(shè)計制作按需網(wǎng)站策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,全網(wǎng)整合營銷推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,天門網(wǎng)站建設(shè)費用合理。考慮這樣一個問題,現(xiàn)在你想給為你的項目提供一個插件系統(tǒng),插件可以添加一些方法,或者在某些方法執(zhí)行之前或者之后做些事情,而不干擾其他插件。要實現(xiàn)這個系統(tǒng),簡單的單繼承不是個好辦法,即使多繼承在PHP中是可能的,他也有與生俱來的缺點。
Symfony EventDispatcher以一個簡單有效的方式實現(xiàn)了中介者模式,事件分發(fā)器就是那個中介,讓系統(tǒng)和插件不會耦合在一起,這讓上面的插件系統(tǒng)成為可能,而且他會讓你的項目可擴展性更好。
系統(tǒng)剖析
事件存儲
上面這張圖是分析Symfony EventDispatcher組件源碼得出來的,可以看到事件在系統(tǒng)中是如何存儲的
這里面將事件存儲了兩遍,用來加入優(yōu)先級priority的概念,存如的時候放入上圖中上面的結(jié)構(gòu)中,取出時候從上圖中下面的結(jié)構(gòu)中拿出來,相同的事件名稱可以有不同的優(yōu)先級,優(yōu)先級越高的事件優(yōu)先觸發(fā),優(yōu)先級相同的時候,先插入的事件優(yōu)先觸發(fā)。
排序事件(上圖中下面的結(jié)構(gòu))在插入事件的時候不會構(gòu)建,而是當(dāng)取出事件的時候會生成排好序的事件,當(dāng)相同的事件名中插入新的事件或刪除某個事件的時候,會刪除對應(yīng)的排好序的事件名,后面用到的時候重新構(gòu)建
執(zhí)行事件的時候,會獲取對應(yīng)事件名排好序的linster列表,按照順序依次執(zhí)行。
事件執(zhí)行
如上圖所示,當(dāng)觸發(fā)某個時間的時候,該事件名下面如果監(jiān)聽了多個觸發(fā)動作,他們會按照優(yōu)先級、注冊順序依次觸發(fā),觸發(fā)動作一般是一個可執(zhí)行的“實例”(不管是類還是函數(shù),必須可以通過call_user_func_array調(diào)用),可以傳入三個參數(shù),第一個參數(shù)(必須)是一個Event實例,第二個是觸發(fā)的事件名,第三個是事件分發(fā)器實例。第一個參數(shù)會控制事件是否在該事件名下的所有觸發(fā)動作之間繼續(xù)傳遞,比如上面的linstener_2里面將Event.propagationStopped設(shè)置為true,執(zhí)行完linstener_2后,事件就會停止傳播,linstener_2后面的動作不會觸發(fā)。
除此之外,Event實例中還可以保存其他必要的信息,以便linstener觸發(fā)執(zhí)行的時候,獲取額外的信息。
事件訂閱者
事件訂閱者(Event subscriber),告訴dispathcer實例,他要訂閱的所有事件,不用一個個通過dispathcer實例去注冊。事件訂閱者是一個PHP類,他可以告訴dispathcer他要訂閱的具體的事件。
好處:
關(guān)注的事件不用一個個去注冊。
取消關(guān)注的事件不用一個個去移除注冊。
訂閱者內(nèi)部關(guān)注的事件是一個整體,要么全部關(guān)注要么全部不關(guān)注
實例
普通栗子
include "vendor/autoload.php"; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\EventDispatcher\Event; class UserEvent extends Event { public function name() { return "Cartman"; } public function age() { return "24"; } } $dispatcher = new EventDispatcher(); $dispatcher->addListener("user.name", function($event, $eventName, $dispatcher){ echo "My name is Cartman\n"; }); $dispatcher->addListener("user.name", function($event, $eventName, $dispatcher){ echo "My name is {$event->name()} from Event instance\n"; }, 10); $dispatcher->addListener("user.age", function($event, $eventName, $dispatcher){ echo "My age is 24\n"; }, 10); $dispatcher->addListener("user.age", function($event, $eventName, $dispatcher){ echo "My age is {$event->age()} from Event instance\n"; }, -10); $dispatcher->dispatch("user.name", new UserEvent()); $dispatcher->dispatch("user.age", new UserEvent());
上面的例子輸出
My name is Cartman from Event instance My name is Cartman My age is 24 My age is 24 from Event instance
事件訂閱者栗子
通過Subscriber注冊事件
include "vendor/autoload.php"; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\EventDispatcher\Event; use Symfony\Component\EventDispatcher\EventSubscriberInterface; class BookEvent extends Event { public $name = self::class; } class BookSubscriber implements EventSubscriberInterface { public static function getSubscribedEvents() { return [ "chinese.name" => "chineseNameShow", "english.name" => [ ["englishNameShow", -10], ["englishNameAFter", 10], ], "math.name" => ["mathNameShow", 100] ]; } public function chineseNameShow(Event $event) { echo "我是漢語書籍\n"; } public function englishNameShow(Event $event) { echo "我是英文書籍\n"; } public function englishNameAFter(Event $event) { echo "我是展示之后的英文書籍[來自于Event實例{$event->name}]\n"; } public function mathNameShow(Event $event) { echo "我是展示的數(shù)學(xué)書籍\n"; } } $dispatcher = new EventDispatcher(); $subscriber = new BookSubscriber(); $dispatcher->addSubscriber($subscriber); $dispatcher->dispatch("english.name", new BookEvent()); $dispatcher->dispatch("chinese.name"); $dispatcher->removeSubscriber($subscriber); $dispatcher->dispatch("math.name");
輸出為內(nèi)容:
我是展示之后的英文書籍[來自于Event實例BookEvent] 我是英文書籍 我是漢語書籍
關(guān)于EventDispatcher事件分發(fā)組件是怎樣的問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。
網(wǎng)站標(biāo)題:EventDispatcher事件分發(fā)組件是怎樣的-創(chuàng)新互聯(lián)
標(biāo)題URL:http://muchs.cn/article28/dhcgcp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、軟件開發(fā)、域名注冊、App開發(fā)、品牌網(wǎng)站制作、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容