我想我在文檔中遺漏了一些東西,但問題很簡單。假設我有一條消息 classMessageOne和MessageTwoextends MessageOne。我也有MessageOneHandler應該處理的MessageOne:__invoke(MessageOne $messageOne)哪個MessageTwoHandler應該只處理MessageTwo:__invoke(MessageTwo $messageTwo)問題是什么時候派遣它由和MessageTwo處理。是的,由于繼承,它是完全明智的,并且一切在邏輯上都是正確的,但是有什么“symfony”方法可以防止這種情況發生嗎?MessageHandlerOneMessageHandlerTwo當然,我可以通過修改這些類的繼承來解決這個問題,但是有沒有更好的方法呢?此外debug:messenger按預期顯示一切,每個消息類一個處理程序,沒有繼承問題。
1 回答

侃侃無極
TA貢獻2051條經驗 獲得超10個贊
繼承很少是適合消息的上帝。
如果MessageTwo extends MessageOne
,則$messageTwo instanceof MessageOne
返回 true,就這么簡單。
此外,消息應該非常簡單和輕量級,因此代碼重復通常不應該是一個問題。但是如果出于某種原因你確實需要在消息類之間重用一些代碼,你有幾個選擇:
您可以使處理短路,以便如果
get_class($message) !== MessageOne::class
然后處理程序可以不做任何工作就返回……但我個人認為這將是一個脆弱的設計。
更好的選擇是簡單地為您的消息重新設計繼承模型。
MessageOne
和之間的共享邏輯MessageTwo
可以移至父級AbstractMessage
,兩者都繼承。處理程序會正確地類型提示具體的消息類型,并且不會有混淆。根據您要進行的代碼重用類型,您可以將共享代碼移動到
Trait
具有靜態方法的 a 或 helper 類。如果這些中的任何一個有任何好處,將完全取決于您的應用程序的具體情況,最終將是一個見仁見智的問題。
- 1 回答
- 0 關注
- 105 瀏覽
添加回答
舉報
0/150
提交
取消