亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解EventDispatcher事件分發(fā)組件

 更新時間:2016年12月25日 11:48:16   作者:奔跑的Man  
Symfony EventDispatcher以一個簡單有效的方式實現了中介者模式,事件分發(fā)器就是那個中介,讓系統和插件不會耦合在一起,這讓上面的插件系統成為可能,而且他會讓你的項目可擴展性更好。本文將對此進行詳細介紹,需要的朋友一起來看下吧

引言

考慮這樣一個問題,現在你想給為你的項目提供一個插件系統,插件可以添加一些方法,或者在某些方法執(zhí)行之前或者之后做些事情,而不干擾其他插件。要實現這個系統,簡單的單繼承不是個好辦法,即使多繼承在PHP中是可能的,他也有與生俱來的缺點(多繼承不太了解,感覺挺操蛋的)。

Symfony EventDispatcher以一個簡單有效的方式實現了中介者模式,事件分發(fā)器就是那個中介,讓系統和插件不會耦合在一起,這讓上面的插件系統成為可能,而且他會讓你的項目可擴展性更好。

上面的話,翻譯自Symfony官方文檔片段

系統剖析

事件存儲

上面這張圖是分析Symfony EventDispatcher組件源碼得出來的,可以看到事件在系統中是如何存儲的

這里面將事件存儲了兩遍,用來加入優(yōu)先級priority的概念,存如的時候放入上圖中上面的結構中,取出時候從上圖中下面的結構中拿出來,相同的事件名稱可以有不同的優(yōu)先級,優(yōu)先級越高的事件優(yōu)先觸發(fā),優(yōu)先級相同的時候,先插入的事件優(yōu)先觸發(fā)。

排序事件(上圖中下面的結構)在插入事件的時候不會構建,而是當取出事件的時候會生成排好序的事件,當相同的事件名中插入新的事件或刪除某個事件的時候,會刪除對應的排好序的事件名,后面用到的時候重新構建

執(zhí)行事件的時候,會獲取對應事件名排好序的linster列表,按照順序依次執(zhí)行。

事件執(zhí)行

如上圖所示,當觸發(fā)某個時間的時候,該事件名下面如果監(jiān)聽了多個觸發(fā)動作,他們會按照優(yōu)先級、注冊順序依次觸發(fā),觸發(fā)動作一般是一個可執(zhí)行的“實例”(不管是類還是函數,必須可以通過call_user_func_array調用),可以傳入三個參數,第一個參數(必須)是一個Event實例,第二個是觸發(fā)的事件名,第三個是事件分發(fā)器實例。第一個參數會控制事件是否在該事件名下的所有觸發(fā)動作之間繼續(xù)傳遞,比如上面的linstener_2里面將Event.propagationStopped設置為true,執(zhí)行完linstener_2后,事件就會停止傳播,linstener_2后面的動作不會觸發(fā)。

除此之外,Event實例中還可以保存其他必要的信息,以便linstener觸發(fā)執(zhí)行的時候,獲取額外的信息。

事件訂閱者

事件訂閱者(Event subscriber),告訴dispathcer實例,他要訂閱的所有事件,不用一個個通過dispathcer實例去注冊。事件訂閱者是一個PHP類,他可以告訴dispathcer他要訂閱的具體的事件。

好處:

  • 關注的事件不用一個個去注冊。
  • 取消關注的事件不用一個個去移除注冊。

訂閱者內部關注的事件是一個整體,要么全部關注要么全部不關注

實例

普通栗子

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 "我是展示的數學書籍\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");

輸出為內容:

我是展示之后的英文書籍[來自于Event實例BookEvent]
我是英文書籍
我是漢語書籍

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關文章

  • web php include攻防世界php安全示例詳解

    web php include攻防世界php安全示例詳解

    這篇文章主要介紹了php安全防護的防注入include文件示例詳解,有需要的朋友可以借鑒參考下, 希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2021-10-10
  • php中Y2K38的漏洞解決方法實例分析

    php中Y2K38的漏洞解決方法實例分析

    這篇文章主要介紹了php中Y2K38的漏洞解決方法,以實例形式對php中Y2K38的漏洞的原理及相應的解決方法進行了較為深入的分析,需要的朋友可以參考下
    2014-09-09
  • thinkphp 一個頁面使用2次分頁的實現方法

    thinkphp 一個頁面使用2次分頁的實現方法

    thinkphp內置ORG.Util.Page方法分頁,使分頁變得非常簡單快捷。 但是如果一個頁面里需要使用2次分頁,就會產生沖突,這里先記錄下百度來的解決辦法。需要的朋友可以參考下
    2013-07-07
  • PHP Array交叉表實現代碼

    PHP Array交叉表實現代碼

    最近需要做到交叉表,而公司的需求比較復雜,一般的交叉表工具都不適合用
    2010-08-08
  • 針對PHP開發(fā)安全問題的相關總結

    針對PHP開發(fā)安全問題的相關總結

    今天小編就為大家分享一篇關于針對PHP開發(fā)安全問題的相關總結,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • php將圖片文件轉換成二進制輸出的方法

    php將圖片文件轉換成二進制輸出的方法

    這篇文章主要介紹了php將圖片文件轉換成二進制輸出的方法,涉及php針對圖片文件的讀取與轉換輸出技巧,需要的朋友可以參考下
    2015-06-06
  • 寫出高質量的PHP程序

    寫出高質量的PHP程序

    這是一個很老的話題了,現在的PHP程序員都在追求所謂的高性能,但高性能并不代表是高質量,什么是高質量的PHP程序呢?我認為,高質量的PHP程序首先得具備以下的要素
    2012-02-02
  • 方便實用的PHP生成靜態(tài)頁面類(非smarty)

    方便實用的PHP生成靜態(tài)頁面類(非smarty)

    不喜歡Smarty,直接寫了一個生成靜態(tài)的類,方便簡單實用,希望大家繼續(xù)完善。
    2008-11-11
  • PHP設計模式之模板方法模式實例淺析

    PHP設計模式之模板方法模式實例淺析

    這篇文章主要介紹了PHP設計模式之模板方法模式,結合實例形式簡單分析了php設計模式中模板方法模式的概念、原理、定義、使用方法及相關操作注意事項,需要的朋友可以參考下
    2018-12-12
  • PHP $O00OO0=urldecode & eval 解密,記一次商業(yè)源碼的去后門

    PHP $O00OO0=urldecode & eval 解密,記一次商業(yè)源碼的去后門

    最近看到如下的php代碼$O00OO0=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");等很長的代碼,這里給出破解方法,需要的朋友可以參考下
    2020-09-09

最新評論