我正在寻找一种合适的方法来减少我为Symfony2框架编写的消息传递包中的耦合,以便我可以在应用程序之间轻松使用它。
Message实体的每个实例都应该有一个发件人和一个收件人instanceof Symfony\Component\Security\Core\User\UserInterface
,我可以在属性的setter中要求得很好。但是,在设置ORM关系时,似乎我必须专门设置targetEntity(例如Foo\BarBundle\Entity\User
),这意味着在不同应用程序中对Message实体的所有进一步使用都需要更改代码,或者将他们变成使用User实体,这在我看来并不属于消息包的范围。
关于如何在这种情况下减少耦合的任何建议/最佳实践?
编辑:我尝试使用扩展程序设置一个全局参数并在注释中使用它,例如@ORM\ManyToOne(targetEntity="%my.entity%")
,但似乎注释解析器不转换参数,因为该字符串被解释为文字,但当然失败了。
答案 0 :(得分:4)
我最终确定的解决方案是创建一个存储在数据库中的MessengerIdentity,它接受一个对象并存储其类名和标识符。然后我使用LifecycleEvent加载对存储在MessengerIdentity中的实体的引用,这样$messenger->getSender()->getUsername
之类的内容仍然可以。
您可以看到我的实施on github(特别是entities和Doctrine event listener)...您还可以看到doctrine2用户组here中的讨论。
编辑:经过进一步审议后,我认为我不喜欢上面谈到的实现(一方面,我基本上将代码复制粘贴到其他项目中,感觉非常混乱并且违反了DRY),所以我重构了我的代码,以便Message实体是一个抽象映射的超类,使用业务逻辑需要的抽象方法,引用发送者和接收者。
现在由最终的开发人员来创建Message实体的最终实现,并且基类甚至没有触及发送者和接收者的实现,这实现了我希望的结果,即减少了bundle对特定的依赖性用户类。
答案 1 :(得分:1)
您可以创建一个包含所有业务逻辑的Model对象,然后创建一个扩展模型的Entity,但会将实体管理器代码和学说注释添加到其中。这就是FOSUserBundle的工作原理。