我一直在Doctrine 2中将值对象实现为自定义DBAL类型,并且它一直运行正常。但是我一直想知道这是不是最好的方法。我已经考虑过使用Post Load监听器来实例化Value Objects。同时在请求时通过Entity访问器实例化它们,后者的优点是我不会实例化比我需要的更多的对象。
我的问题是:哪种方法最好?或者有更好的方法吗?以上是否有任何陷阱或不合理的表现?
答案 0 :(得分:8)
恕我直言,两种方法在等待native support for value objects时同样有价值。
我个人赞成第二种方法(在请求时通过访问器实例化它们)有两个原因:
这种方法的一个例子:
class User
{
protected $street;
protected $city;
protected $country;
public function setAddress(Address $address)
{
$this->street = $address->getStreet();
$this->city = $address->getCity();
$this->country = $address->getCountry();
}
public function getAddress()
{
return new Address(
$this->street,
$this->city,
$this->country
);
}
}
当Doctrine提供本机VO支持时,此代码将非常容易重构。
关于custom mapping types,我也会使用它们,对于单字段VO(Decimal
,Point
,Polygon
,...),但会倾向于保留它们适用于可在多个项目中使用的通用,可重用类型,而不适用于特定于项目的单字段VO,我赞成采用上述方法。