保持我的symfony2捆绑包解耦

保持我的symfony2捆绑包解耦,symfony,doctrine,bundle,Symfony,Doctrine,Bundle,我有两个不同的包: 第一个bundle OrderBundle具有核心逻辑和功能,包含Order实体 第二个bundle,CustomerBundle依赖于OrderBundle并包含客户实体 我需要在客户和订单之间创建一个“一对一”的关系(显然一个客户执行多个订单),但我需要保持第一个捆绑包OrderBundle与第二个捆绑包OrderBundle的解耦,因为OrderBundle旨在用于其他用途 我认为正确的方法可能是这样的,但我不知道如何有一个具体的实现 如果我不能在多通原则映射中具体

我有两个不同的包:

  • 第一个bundle OrderBundle具有核心逻辑和功能,包含Order实体
  • 第二个bundle,CustomerBundle依赖于OrderBundle并包含客户实体
我需要在客户和订单之间创建一个“一对一”的关系(显然一个客户执行多个订单),但我需要保持第一个捆绑包OrderBundle与第二个捆绑包OrderBundle的解耦,因为OrderBundle旨在用于其他用途

我认为正确的方法可能是这样的,但我不知道如何有一个具体的实现

如果我不能在多通原则映射中具体使用类似客户的目标实体,如何实现订单和客户之间的关系

非常感谢,提前

更新

我写下相关的代码,以便更好地解释

\\ 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和接口?

是的,这是正确的方法

如您提到的文档所示,您可以在manytone映射中将类似于
OrderSubjectInterface
的内容指定为targetEntity


这样,您就知道您的订单与主题相关。在您的案例中,这些主题是客户,如
app/config/config.yml

中所定义的,如果到处都有实体定义,则很难完全解耦捆绑包。问题是,该原则默认不允许相关实体丢失。让我们从头开始

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

这样做的目的是,它允许您提取订单包并将其放在具有完全不同的实体结构的环境中。重要的是,与订单相关的实体不能在新环境中丢失(它们可以完全不同,但它们必须实现与原始环境相同的接口)。然后更改设置,使接口指向新环境中的实体


如您所见,这不是“完全解耦”的代码。没有一些细节,我帮不了你更多。这种关系是双向的还是单向的?“重复使用用于其他物品”的确切含义是什么?您能更详细一点吗?

谢谢Andrey,我会尝试更详细一点:我想要一个双向关系,说“重复使用用于其他物品”意味着OrderBundle应该由其他捆绑包使用,而不需要客户关系。所以我不需要在OrderBundle中直接提到客户。我想要没有显式映射关系的OrderBundle;CustomerBundle依赖于OrderBundle,因此关系colud可以在那里实现。希望足够清楚(用我糟糕的英语)。那么你的意思是在其他没有CustomerBundle的Symfony项目中使用OrderBundle?或者你的意思是你想在这个项目中单独使用,但是应该可以在其他捆绑包中使用?因为在后一种情况下,您不需要太多解耦,它已经可以从其他捆绑包中使用,而且客户已经存在,所以不用担心。但我怀疑是前一种情况。在这种情况下,最好的方法是让客户实体实现CustomerInterface,然后使用ResolveTargetEntity。但请注意,您仍然需要一个虚拟的客户实体。另外,请查看一个(基本上是一个黑客)我不久前安装的。这是一个肮脏的黑客行为,当接口未绑定到实体时,它基本上会沉默或跳过抛出的缺少实体异常。这样,您将在实体中拥有一个关系,但它不会出现在数据库中(没有虚拟表)。虽然它没有经过广泛的测试,但它对我来说很有效。我有一个独立的OrderBundle,必须在其他Symfony项目中重用,我需要与CustomerBundle建立关系。OrderBundle可以通过composer从私有SVN repo安装,因此我认为我无法在“独立”项目中定义与CustomerBundle的明确关系。因此,用例是:项目A:仅OrderBundle项目B:OrderBundle+CustomerBundle(客户与订单有一对多关系)