Symfony2事件分發組件

介紹

面向對象設計通過讓每個類有明確的分工責任,確保代碼的靈活性和可擴展性。開發人員可以通過繼承父類,修改其中方法。如果是想要和其他做同樣事情的開發人員共享其中的改變,通過繼承的方法將無法實現。

舉個例子,你想爲自己的項目添加一個插件系統,插件需要能夠添加方法,或者是當做一個事情之前或者執行一個方法之後做些其他的事情。通過繼承很難將實現。

Symfony2通過實現Mediator模式(中間人)可以實現該功能。

以HttpKernel組件爲例,當響應對象創建之後,用系統的其他元素對其進行修改將非常必要(例如添加緩存聲明),symfony通過扔出一個kernel事件來實現:
  • 一個聆聽者(對象)告訴發令中心對象(dispatcher)kernel.response事件
  • 在某個時刻,symfony2 kernel告訴調度對象分派kernel.response事件,把Response對象作爲一個可以訪問的參數傳遞出去
  • 調度對象通知所有的kernel.response聆聽者,允許他們對Resonse對象進行修改

安裝

  • 使用官方git倉庫(https://github.com/symfony/EventDispatcher)
  • 使用composer

使用方法

事件

當一個事件被分派出去的時候,它需要一個獨一無二的標識符,也是所有聆聽者聆聽的對象。一個事件實例也會被創建並且傳遞到所有的聆聽者。事件對象常常包含被分派的事件對象。

命名規範

可以是符合下面規則的任何字符串
  • 小寫字母,數字,點,下劃線
  • 前綴名空間後面加點
  • 以一個動詞作爲結尾,用來說明將要發生的事情(例如請求)
比如:
  • kernel.response
  • form.pre_set_data

事件名稱和事件對象

當調度對象通知聆聽者的時候,它將事件對象作爲參數傳遞過去。時間對象的基類非常簡單,裏面只有一個停止事件擴張的方法。

通常情況下,關於特定事件的數據需要同時和事件對象一起傳過去,這樣聆聽者可以有需要的信息。當創建一個事件的聆聽者時,傳遞到聆聽者的事件對象可能是事件對象的一個子類,裏面包含了更多的可以提取和響應該事件的信息。

發令者(The Dispatcher)

發令者是事件分發系統的核心成員。總而言之,只有一個發令者被創建,維護所有註冊的聆聽者,當一個事件被分派的時候,它會通知所有聆聽那個事件的聆聽者。
use Symfony\Component\EventDispatcher\EventDispatcher;

$dispatcher = new EventDispatcher();

連接聆聽者

爲了使用已經存在的事件,需要連接聆聽者,這樣當發生特定事件的時候可以執行行動
$listener = new AcmeListener();
$dispatcher->addListener('foo.action', array($listener, 'onFooAction'));

addListener有三個參數:
  • 聆聽的事件的名稱
  • 當事件觸發是一個可執行的php回調函數
  • 被執行的順序可選的一個數字,越高則越重要
未完待續
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章