如何避免在Symfony Messenger中处理来自“子”类的消息?

问题描述 投票:0回答:1

我想我在文档中丢失了一些东西,但是问题很简单。

假设我有MessageOneMessageTwo类的消息,它们扩展了MessageOne

我也有应该处理MessageOneHandlerMessageOne

__invoke(MessageOne $messageOne)

并且MessageTwoHandler应该只处理MessageTwo

__invoke(MessageTwo $messageTwo)

问题是,当分派MessageTwo时,它同时由MessageHandlerOneMessageHandlerTwo处理。是的,由于继承,这是完全明智的,并且在逻辑上一切都是正确的,但是是否有任何“ symfony”方法可以防止这种情况呢?

当然,我可以通过重新构造这些类的继承来解决此问题,但是也许有更好的方法吗?

此外debug:messenger可以按预期显示所有内容,每个消息类一个处理程序,而没有继承问题。

php symfony symfony4 symfony5 symfony-messenger
1个回答
0
投票

继承很少会成为消息传递的神。

如果是MessageTwo extends MessageOne,则$messageTwo instanceof MessageOne将返回true,如此简单。

此外,消息应该非常简单且轻巧,因此通常不应该考虑代码重复。但是,如果由于某些原因您确实需要在消息类之间重用某些代码,则可以选择以下几种方法:

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

更好的选择是简单地为您的消息重新构造继承模型。

  • MessageOneMessageTwo之间的共享逻辑可以移动到父级AbstractMessage,两者均从其继承。处理程序将正确键入提示的具体消息类型,并且不会造成混淆。

  • 根据要使用的代码重用类型,可以使用静态方法将共享代码移动到Trait或帮助程序类。如果这两种方法中的任何一种是好的,将完全取决于您的应用程序的细节,最终将是一个意见问题。

© www.soinside.com 2019 - 2024. All rights reserved.