2011-12-09 32 views
8

Obiekty Docelowe implementuję jako niestandardowe typy DBAL w Doctrine 2 i działało poprawnie. Jednak zastanawiałem się, czy to jest najlepszy sposób. Myślałem o użyciu nasłuchu Post Load do utworzenia instancji Value Objects. Inicjowanie ich za pomocą akcesorów Entity na żądanie, z tą ostatnią korzyścią polegałoby na tym, że nie utworzyłbym więcej obiektów, niż potrzebuję.Doctrine 2 Value Objects

Moje pytanie brzmi: która metoda jest najlepsza? Czy istnieje lepszy sposób na zrobienie tego? Czy są tu jakieś błędy lub nieuzasadnione wyniki?

Odpowiedz

8

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.