ИМХО, оба подхода одинаково полезны, ожидая при этом встроенной поддержки для объектов-значений .
Я лично предпочитаю второй подход (создание экземпляров их через средства доступа по запросу) по двум причинам:
- Как вы упомянули, он предлагает лучшую производительность, поскольку преобразование выполняется только при необходимости;
- Он отделяет ваше приложение от зависимости от Doctrine: вы пишете меньше кода, специфичного для Doctrine.
Пример такого подхода:
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.
О пользовательских типах отображения , я их тоже использую, для однополевого VO (Decimal
, Point
, Polygon
, ...), но склонен резервировать их универсальные, многоразовые типы, которые можно использовать в нескольких проектах, а не для специализированного однополевого ВО, где я бы предпочел подход, описанный выше.