DDD PHP Doctrine2 - 映射

时间:2015-04-09 19:50:34

标签: php doctrine mapping domain-driven-design

我会听说你如何使用doctrine2中的数据映射器模式映射域对象。我只是遇到了一个问题,当我的聚合使用干净的php数组并使用php函数来处理数组array_shift时。无论如何,在我开始将学说映射与我的域实体集成之前,它是好的。问题在于,学说如何与实体之间的协作一起工作。每当我的聚合根有一对多关系(或任何其他tbh)时,doctrine就使用了ArrayCollection类,而不仅仅是一个普通的数组。我可以使用像toArray()之类的方法之一,但如果它是一个教条集合类,那么我必须首先检查域对象,这将是脏的。所以无论如何,在返回类之前,我选择在我的聚合存储库中执行此操作。我将反射类集属性设置为public并将其替换为干净的php数组。工作不那么脏,但我还是不喜欢它。所以我的问题是,你们如何处理限制od教条或者对你来说没有像限制这样的东西:)。接下来的问题,如果你们在你的域类中使用Doctrine ArrayCollection?

2 个答案:

答案 0 :(得分:2)

你在使用那些数组?

我怀疑问题在于您使用的是数组而不是对象。对象应反映域并为您提供域中存在的方法。如果要用数组替换现实行为,那么您并没有真正遵循DDD原则。

简单示例:

/**
 *
 * @ORM\Table(name="sales_flat_order")
 * @ORM\Entity(repositoryClass="Candle\OrderBundle\Repository\Mage\OrderRepository")
 */
class Order implements OrderInterface
{

    /**
     * @ORM\OneToMany(targetEntity="OrderItem", mappedBy="order", cascade={"persist"})
     * 
     * @var OrderItem[]
     */
    private $orderItems;

    /**
     * Constructor.
     */
    public function __construct()
    {
        $this->orderItems = new ArrayCollection();
    }

    /**
     * Check if all Items are marked as scanned 
     * 
     * @param integer $warehouseId Warehouse ID to check for. 
     * 
     * @return boolean
     */
    public function isOrderScanCompleted($warehouseId)
    {
        foreach ($this->orderItems as $orderItem) {
            if ($orderItem->getWarehouseId() == $warehouseId
                && !$orderItem->isScanComplete()) {
                return FALSE;
            }
        }

        return TRUE;
    }
}

我可以迭代相关OrderItems的DB值数组,并检查构成" isScanComplete"的值。 flag,但我决定实现它,因此将其封装在OrderItem类中。因此不需要值数组。

答案 1 :(得分:1)

在我的项目中,为了这个目的,我使用了教义实体(映射信息被移动到yml文件并且在域之外)。

学说文件指出:

  

Collection接口和ArrayCollection类与Doctrine命名空间中的其他所有类一样,既不是ORM的一部分,也不是DBAL的一部分,它是一个普通的PHP类,除了依赖于PHP本身(和SPL)之外没有外部依赖性)。因此,在域类和其他地方使用此类不会引入与持久层的耦合。与Common名称空间中的其他所有内容一样,Collection类不是持久层的一部分。如果要从项目中删除Doctrine,并且所有域类的工作方式与之前相同,您甚至可以将该类复制到项目中。

所以在域中使用DoctrineCollection很好,只需将其扩展即可轻松替换,以防您迁移到其他框架/ orm。

另请参阅此幻灯片https://www.slideshare.net/leopro/clean-architecture-with-ddd-layering-in-php-35793127

这是指示例应用https://github.com/leopro/trip-planner

您可能希望将yml / xml文件用于架构映射信息,而不是实体中的注释,以便从域中删除此依赖项。

此问题很久以前就已发布,但此答案可能对其他用户仍然有用