En mi humilde opinión, ambos enfoques son igualmente valiosos, mientras espera native support for value objects.
personalmente favorecen el segundo enfoque (crear instancias de ellos a través de descriptores de acceso cuando se le solicite) por dos razones:
- Como usted ha mencionado, que ofrece un mejor rendimiento que la conversión se realiza sólo cuando sea necesario;
- Desacopla su aplicación de la dependencia de Doctrine: está escribiendo menos código que sea específico de Doctrine.
Un ejemplo de este enfoque:
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
);
}
}
Este código será bastante fácil refactorizar cuando Doctrina ofrecerá soporte nativo VO.
Sobre custom mapping types, hago uso de ellos, así, para un solo campo de VO (Decimal
, Point
, Polygon
, ...), pero tendería a reservarlos para fines generales, tipos reutilizables que se puede utilizar en múltiples proyectos , no para VO de campo único específico para un proyecto donde yo preferiría el enfoque anterior.