在当前的应用程序中,我们遵循DDD样式并依赖于DDD,我们有聚合范围,不能在该范围内使用其他聚合(如果我们需要建立关系,我们只能使用其他聚合的id)。
示例:我们有用户聚合,我们有媒体聚合,用户可以有一个图标,这是与媒体的关系,但依赖于DDD我不能使它像
/**
* @OneToOne(targetEntity="Media")
* @JoinColumn(name="icon_id", referencedColumnName="id")
*/
private $icon;
在这种情况下,我需要将整个Media实体传递给破坏DDD规则的User。
所以为了遵循DDD规则,我就这样做了
/**
* @var MediaId
*
* @ORM\Column(type="id", nullable=true)
*/
private $iconid;
但这意味着我们可以传递任何甚至不存在的id。我肯定可以查询数据库以检查媒体是否存在,但是它再次打破DDD规则,因为当我们与User聚合达成交易时,我们无法对Media聚合进行任何操作。
所以问题是我可以以某种方式告诉学说添加外键而不创建关联吗?或者我可能需要通过迁移手动添加外键?
您可以在setter中执行以下操作:
public function setIcon($icon){
if( ! ($icon instanceof Media) ){
/** @var EntityManger $em get your EntityManager **/
$icon = $em->getReference(Media::class, $icon)
}
$this->icon = $icon;
}
这将为您提供一个代理元素,以便您可以设置与之的关系。
在getter中你可以返回对象的id