我想我在文档中丢失了一些东西,但是问题很简单。
假设我有MessageOne
和MessageTwo
类的消息,它们扩展了MessageOne
。
我也有应该处理MessageOneHandler
的MessageOne
:
__invoke(MessageOne $messageOne)
并且MessageTwoHandler
应该只处理MessageTwo
:
__invoke(MessageTwo $messageTwo)
问题是,当分派MessageTwo
时,它同时由MessageHandlerOne
和MessageHandlerTwo
处理。是的,由于继承,这是完全明智的,并且在逻辑上一切都是正确的,但是是否有任何“ symfony”方法可以防止这种情况呢?
当然,我可以通过重新构造这些类的继承来解决此问题,但是也许有更好的方法吗?
此外debug:messenger
可以按预期显示所有内容,每个消息类一个处理程序,而没有继承问题。
继承很少会成为消息传递的神。
如果是MessageTwo extends MessageOne
,则$messageTwo instanceof MessageOne
将返回true,如此简单。
此外,消息应该非常简单且轻巧,因此通常不应该考虑代码重复。但是,如果由于某些原因您确实需要在消息类之间重用某些代码,则可以选择以下几种方法:
get_class($message) !== MessageOne::class
则处理程序可以不做任何工作而返回...但是我个人认为这将是一个脆弱的设计。 更好的选择是简单地为您的消息重新构造继承模型。
MessageOne
和MessageTwo
之间的共享逻辑可以移动到父级AbstractMessage
,两者均从其继承。处理程序将正确键入提示的具体消息类型,并且不会造成混淆。
根据要使用的代码重用类型,可以使用静态方法将共享代码移动到Trait
或帮助程序类。如果这两种方法中的任何一种是好的,将完全取决于您的应用程序的细节,最终将是一个意见问题。