2011-12-09 79 views
8

我一直在實現值對象作爲定義DBAL類型在Doctrine 2中,它一直工作正常。不過,我一直在想,這是否是最好的方法。我想過使用Post Load偵聽器來實例化值對象。在請求時還通過實體訪問器實例化它們,後者的優勢是我不會實例化比我需要的更多的對象。Doctrine 2值對象

我的問題是:哪種方法最好?還是有更好的方法來做到這一點?上面有沒有什麼問題或不合理的表現?

回答

8

恕我直言,兩種方法同樣有價值,同時等待native support for value objects

我個人傾向於第二種方法有兩個原因(請在實例他們通過存取):

  • 正如你提到的,它提供了更好的性能,在需要時轉換隻能做;
  • 它將您的應用程序從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 
     ); 
    } 
} 

該代碼將是相當容易的重構時學說將提供原生支持VO。

關於custom mapping types,我使用它們爲好,單場VO(DecimalPointPolygon,...),但往往會保留他們爲通用型,可在多個項目中使用可重複使用的類型,而不是針對項目特定的單場VO,我贊成上述方法。