如何避免在 Symfony Messenger 中处理来自 "child" 类 的消息?
How to avoid handling messages from "child" classes in Symfony Messenger?
我想我在文档中遗漏了一些东西,但问题很简单。
假设我有一条 class MessageOne
和 MessageTwo
的消息,它扩展了 MessageOne
.
我还有 MessageOneHandler
应该处理 MessageOne
:
__invoke(MessageOne $messageOne)
和 MessageTwoHandler
应该只处理 MessageTwo
:
__invoke(MessageTwo $messageTwo)
问题是当 MessageTwo
被调度时,它被 MessageHandlerOne
和 MessageHandlerTwo
处理。是的,由于继承,它是完全合理的,并且一切在逻辑上都是正确的,但是有什么 "symfony" 方法可以防止这种情况发生吗?
当然,我可以通过修改这些classes的继承来解决这个问题,但是有没有更好的方法呢?
此外 debug:messenger
显示所有内容都符合预期,一条消息一个处理程序 class 没有继承问题。
继承很少会成为适合消息的上帝。
如果 MessageTwo extends MessageOne
,那么 $messageTwo instanceof MessageOne
会 return 正确,就这么简单。
此外,消息应该非常简单和轻量级,因此代码重复通常不是问题。但是如果出于某种原因你确实需要在消息 class 之间重用一些代码,你有几个选择:
- 您可以使处理短路,这样如果
get_class($message) !== MessageOne::class
那么处理程序可以 return 而不做任何工作...但我个人认为这将是一个脆弱的设计。
更好的选择是简单地修改消息的继承模型。
MessageOne
和 MessageTwo
之间的共享逻辑可以移至父 AbstractMessage
,两者都继承。处理程序会正确地对具体消息类型进行类型提示,不会造成混淆。
根据您要进行的代码重用类型,您可以将共享代码移动到 Trait
或带有静态方法的助手 class。如果这些中的任何一个有任何好处,将完全取决于您的应用程序的具体情况,最终将是一个见仁见智的问题。
我想我在文档中遗漏了一些东西,但问题很简单。
假设我有一条 class MessageOne
和 MessageTwo
的消息,它扩展了 MessageOne
.
我还有 MessageOneHandler
应该处理 MessageOne
:
__invoke(MessageOne $messageOne)
和 MessageTwoHandler
应该只处理 MessageTwo
:
__invoke(MessageTwo $messageTwo)
问题是当 MessageTwo
被调度时,它被 MessageHandlerOne
和 MessageHandlerTwo
处理。是的,由于继承,它是完全合理的,并且一切在逻辑上都是正确的,但是有什么 "symfony" 方法可以防止这种情况发生吗?
当然,我可以通过修改这些classes的继承来解决这个问题,但是有没有更好的方法呢?
此外 debug:messenger
显示所有内容都符合预期,一条消息一个处理程序 class 没有继承问题。
继承很少会成为适合消息的上帝。
如果 MessageTwo extends MessageOne
,那么 $messageTwo instanceof MessageOne
会 return 正确,就这么简单。
此外,消息应该非常简单和轻量级,因此代码重复通常不是问题。但是如果出于某种原因你确实需要在消息 class 之间重用一些代码,你有几个选择:
- 您可以使处理短路,这样如果
get_class($message) !== MessageOne::class
那么处理程序可以 return 而不做任何工作...但我个人认为这将是一个脆弱的设计。
更好的选择是简单地修改消息的继承模型。
MessageOne
和MessageTwo
之间的共享逻辑可以移至父AbstractMessage
,两者都继承。处理程序会正确地对具体消息类型进行类型提示,不会造成混淆。根据您要进行的代码重用类型,您可以将共享代码移动到
Trait
或带有静态方法的助手 class。如果这些中的任何一个有任何好处,将完全取决于您的应用程序的具体情况,最终将是一个见仁见智的问题。