2

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

假设我有一条关于 class 的消息,MessageOne并且MessageTwoextends MessageOne

我也有MessageOneHandler哪个应该处理MessageOne

__invoke(MessageOne $messageOne)

并且MessageTwoHandler应该只处理MessageTwo

__invoke(MessageTwo $messageTwo)

问题是何时MessageTwo调度它由MessageHandlerOne和处理MessageHandlerTwo。是的,由于继承,这是完全明智的,一切在逻辑上都是正确的,但是有什么“symfony”方法可以防止这种情况发生吗?

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

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

4

1 回答 1

1

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

如果MessageTwo extends MessageOne, then$messageTwo instanceof MessageOne将返回 true,就这么简单。

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

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

更好的选择只是重新设计消息的继承模型。

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

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

于 2020-06-01T08:36:24.497 回答