亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何避免在 Symfony Messenger 中處理來自“子”類的消息?

如何避免在 Symfony Messenger 中處理來自“子”類的消息?

PHP
慕雪6442864 2023-04-28 13:56:22
我想我在文檔中遺漏了一些東西,但問題很簡單。假設我有一條消息 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 類。如果這些中的任何一個有任何好處,將完全取決于您的應用程序的具體情況,最終將是一個見仁見智的問題。


查看完整回答
反對 回復 2023-04-28
  • 1 回答
  • 0 關注
  • 105 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號