为了账号安全,请及时绑定邮箱和手机立即绑定

如何避免在 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 关注
  • 80 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信