Cribbb基於DDD/Domain Event領域事件的開源PHP通知系統

banq發表於2015-01-22
Cribbb是一個使用DDD聚合根和領域事件Domain Events概念開發的PHP開源通知框架:cribbb/cribbb · GitHub

幾乎所有Web應用都有一個通知提醒系統,這些通知系統都有共有的屬性和功能:

一個發往使用者的訊息管道
Cribbb通知系統扮演一種訊息管道,通知使用者最近的事件,有許多不同的“鉤子”可以觸發通知新增到使用者的訊息管道中。

一個訊息可以是任何型別
有許多不同的通知型別,針對應用中發生的不同的可能動作。

應當由可讀和未讀狀態
通知訊息應該有狀態,一旦使用者有開啟動作從而改變通知訊息的狀態,這是很重要的使用者介面設計。

傳送Email和作為UI一部分現實
預設情況使用者會收到一份Email,和使用者介面提醒一樣,使用者可以關閉郵件通知。

一個動作可以引起許多通知
在Cribbb中一個動作可以引起發給一個或多個使用者的通知,這意味著應當在動作和通知之間解耦。

通知訊息應該被佇列化
使用佇列系統傳送通知,因為針對一個動作可能有大量Email傳送,通知傳送不必即時。

通知是傳送給使用者的一個訊息,告訴他們他們對應用中感興趣的事件發生了,也許是一個使用者follow了他,或回覆了他的帖子。

Domain Events是易於針對應用中事件的發生實現相應的通知機制的,當一個領域事件傳送時,註冊的監聽器類將自動引爆,這樣動作和事件實現解耦,我們可以根本無需接觸事件的觸發動作而新增事件的監聽器。

有界上下文

經過幾周發現了區分不同的限定上下文Bounded Conext 重要性,一個有界的上下文是作為保護維護統一內部模型的層出現,這對於大型應用很重要。

Cribbb有一個身份方面的有界上下文,功能有:包括註冊一個新使用者 following其他使用者,更新賬戶資訊等。

那麼通知功能是否有自己的有界上下文?或者是身份有界上下文的一部分?

通知功能其實應該屬於身份有界上下文:

首先,通知是使用者身份系統的一種重要概念,應用可以觸發一個通知,但是通知僅僅對於註冊有身份的使用者是重要的。

其次,在通知模型和使用者身份識別模型之間沒有矛盾,如果有,那麼我們可能就區分為不同的有界上下文。

最後,一個通知沒有道理不和使用者繫結,一個使用者只能檢視自己的通知,不能看其他使用者的通知,我們為Cribbb建立一個獲得通知的API,端點是:me/notifications.

通知實體和使用者聚合
通知應該作為實體建模,通常你預設會建立為值物件 而不是實體,因為簡單,但是這次我們沒有選擇。

通知沒有必要知道使用者上下文以外的事情,我們應當能夠從資料庫任意地接受訊息,而不是隻能從User物件獲得一個使用者的通知。

這意味著通知如果放在User聚合中很整潔合適。Notification通知實體也能非常簡單。

首先,通知需要一個內容體需要儲存通知的內容文字資料。

其次,我們需要一個 已讀/未讀的狀態,我們需要通知訊息被讀的時間戳,這樣我們能夠判斷這兩個狀態。

最後,我們分類通知以便可以過濾它們,在通知實體中使用一個關鍵詞來標識。

相關文章