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