【问题标题】:Reduce coupling in entities减少实体中的耦合
【发布时间】:2011-05-23 23:05:55
【问题描述】:

我正在寻找一种适当的方法来减少我为 Symfony2 框架编写的消息传递包中的耦合,以便我可以轻松地在应用程序之间使用它。

消息实体的每个实例都应该有一个发送者和一个接收者instanceof Symfony\Component\Security\Core\User\UserInterface,我可以在属性的设置器中要求它们。但是,在设置 ORM 关系时,似乎我必须专门设置一个 targetEntity(例如Foo\BarBundle\Entity\User),这意味着在不同应用程序中对 Message 实体的所有进一步使用都需要更改代码,或者硬拉他们使用 User 实体,在我看来,这似乎不在消息包的范围内。

关于在这种情况下如何减少耦合的任何建议/最佳实践?

编辑:我尝试设置一个带扩展名的全局参数并在注释中使用它,例如@ORM\ManyToOne(targetEntity="%my.entity%"),但似乎注释解析器不转换参数,因为字符串被解释为文字,当然失败了。

【问题讨论】:

    标签: php doctrine-orm symfony


    【解决方案1】:

    我最终确定的解决方案是创建一个存储在数据库中的 MessengerIdentity,它接收一个对象并存储其类名和标识符。然后我使用 LifecycleEvent 加载对存储在 MessengerIdentity 中的实体的引用,这样$messenger->getSender()->getUsername 之类的东西仍然是可能的。

    您可以看到我的实现on github(特别是entitiesDoctrine event listener)...您还可以看到来自doctrine2 用户组here 的讨论。

    编辑:经过进一步考虑,我决定我不喜欢我上面谈到的实现(一方面,我本质上是将代码复制粘贴到其他项目中,感觉非常杂乱且违反 DRY),因此我重构了我的代码,以便 Message 实体是一个抽象映射超类,具有业务逻辑需要的抽象方法,引用发送者和接收者。

    现在由最终开发人员来创建 Message 实体的最终实现,并且基类甚至不涉及发送者和接收者的实现,这达到了我想要的减少捆绑包对特定的依赖的结果用户类。

    【讨论】:

      【解决方案2】:

      您可以创建一个包含所有业务逻辑的模型对象,然后创建一个实体,该实体扩展了模型,但将您的实体管理器代码和原则注释添加到它。这就是 FOSUserBundle 的工作原理。

      【讨论】:

        猜你喜欢
        • 2021-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多