如何避免在 Symfony Messenger 中处理来自 "child" 类 的消息?

How to avoid handling messages from "child" classes in Symfony Messenger?

我想我在文档中遗漏了一些东西,但问题很简单。

假设我有一条 class MessageOneMessageTwo 的消息,它扩展了 MessageOne.

我还有 MessageOneHandler 应该处理 MessageOne:

__invoke(MessageOne $messageOne)

MessageTwoHandler 应该只处理 MessageTwo:

__invoke(MessageTwo $messageTwo)

问题是当 MessageTwo 被调度时,它被 MessageHandlerOneMessageHandlerTwo 处理。是的,由于继承,它是完全合理的,并且一切在逻辑上都是正确的,但是有什么 "symfony" 方法可以防止这种情况发生吗?

当然,我可以通过修改这些classes的继承来解决这个问题,但是有没有更好的方法呢?

此外 debug:messenger 显示所有内容都符合预期,一条消息一个处理程序 class 没有继承问题。

继承很少会成为适合消息的上帝。

如果 MessageTwo extends MessageOne,那么 $messageTwo instanceof MessageOne 会 return 正确,就这么简单。

此外,消息应该非常简单和轻量级,因此代码重复通常不是问题。但是如果出于某种原因你确实需要在消息 class 之间重用一些代码,你有几个选择:

  • 您可以使处理短路,这样如果 get_class($message) !== MessageOne::class 那么处理程序可以 return 而不做任何工作...但我个人认为这将是一个脆弱的设计。

更好的选择是简单地修改消息的继承模型。

  • MessageOneMessageTwo 之间的共享逻辑可以移至父 AbstractMessage,两者都继承。处理程序会正确地对具体消息类型进行类型提示,不会造成混淆。

  • 根据您要进行的代码重用类型,您可以将共享代码移动到 Trait 或带有静态方法的助手 class。如果这些中的任何一个有任何好处,将完全取决于您的应用程序的具体情况,最终将是一个见仁见智的问题。