保持我的symfony2捆绑解耦

时间:2014-05-26 09:06:09

标签: symfony doctrine bundle

我有两个不同的包:

  • 第一个包 OrderBundle ,具有核心逻辑和功能,并包含订单实体。
  • 第二个捆绑包, CustomerBundle 依赖于OrderBundle并包含Customer实体。

我需要在客户和订单之间创建一个oneToMany关系(显然一个客户执行许多订单)但我需要保持第一个包 OrderBundle 与第二个包分离,因为OrderBundle旨在重用其他的东西。

我认为正确的方法可能是这样的http://symfony.com/doc/current/cookbook/doctrine/resolve_target_entity.html,但我无法弄清楚如何具体实施。

如果我不能在ManyToOne学说映射中专门使用像targetEntity这样的客户,那么如何实现Order和Customer之间的关系?

非常感谢,提前。

更新

我写下了所涉及的代码,以便更好地解释。

\\ Order\Bundle\Entity\Order.php

class Order {   
   /**
     * @ORM\ManyToOne(targetEntity="Order\Bundle\Model\OrderSubjectInterface", inversedBy="orders")
     * @var SourceSubjectInterface
     */
     protected $subject;    // How to define getter ans setter for $subject ? Do I
                               have to use php app/console doctrine:generate:entities command?
     ...



\\ Customer\Bundle\Entity\Customer.php
use Order\Bundle\Model\OrderSubjectInterface;

class Customer implements OrderSubjectInterface{
   /**
     * @ORM\OneToMany(targetEntity="Order\Bundle\Entity\Order", mappedBy="subject")
     */
     private $orders;

如何定义getter,setter和界面?

2 个答案:

答案 0 :(得分:2)

是的,这是正确的方法。

如您所提及的文档中所示,您可以在ManyToOne映射中将OrderSubjectInterface指定为targetEntity。

这样,您就知道您的订单与主题相关。在您的情况下,这些主题是app/config/config.yml中定义的客户。

答案 1 :(得分:2)

如果你到处都有实体定义,那么很难完全解耦束。问题是,默认情况下,Doctrine不允许丢失相关实体。让我们从头开始。

如果您只想解耦Order实体,您需要做的是为其所有相关实体创建接口(他们需要实现它们),然后使用ResolveTargetEntity。因此,不是引用完整的实体,而是引用接口(当您在实体中定义关系时)。最后,您可以设置哪个接口映射到配置中的哪个实体。

这样做可以让您获取Order捆绑并将其放在具有完全不同实体结构的环境中。重要的是,在新环境中不得缺少与Order相关的实体(它们可能完全不同,但它们必须实现与原始相同的接口)。然后更改设置,以便接口指向新环境中的实体。

如您所见,这不是“完全解耦”的代码。没有一些细节,我无法帮助你。关系是双向的还是单向的?你对“重用其他东西”的确切含义是什么,你能更详细一点吗?