IMHO, oba podejścia są jednakowo cenne, czekając na native support for value objects.
ja osobiście faworyzują drugie podejście (uruchamianiu ich przez dostępowych na żądanie) z dwóch powodów:
- Jak wspomniano, oferuje lepszą wydajność, jak konwersja jest wykonywana tylko wtedy, gdy zajdzie taka potrzeba;
- Oddziela aplikację od zależności od Doctrine: piszesz mniej kodu, który jest specyficzny dla Doctrine.
Przykładem takiego podejścia:
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
);
}
}
Kod ten będzie dość łatwe byłaby gdy Doctrine oferuje natywną obsługę VO.
O custom mapping types, robię z nich korzystać, a także, dla pojedynczego pola VO (Decimal
, Point
, Polygon
...), ale na ogół jest zarezerwować je dla ogólnego przeznaczenia, wielokrotnego użytku typy, które mogą być wykorzystane w wielu projektach , nie w przypadku pojedynczego pola VO specyficznego dla projektu, w którym preferuję powyższe podejście.