2011-12-09 37 views
8

Ho implementato oggetti valore come tipi DBAL personalizzati in Doctrine 2 e ha funzionato correttamente. Tuttavia mi sono chiesto se questo è il modo migliore. Ho pensato di utilizzare il listener Post Load per creare un'istanza di Value Objects. Anche istanziandoli tramite Accessors Entity quando richiesto, il vantaggio con quest'ultimo sarebbe che non istanzerei più oggetti di quanti ne avessi bisogno.Doctrine 2 Value Objects

La mia domanda è: quale metodo è il migliore? O c'è un modo migliore per farlo? Ci sono trucchi o risultati di prestazioni irragionevoli con quanto sopra?

risposta

8

IMHO, entrambi gli approcci sono ugualmente validi, in attesa di native support for value objects.

io personalmente favoriscono il secondo approccio (li un'istanza tramite funzioni di accesso quando richiesto) per due motivi:

  • Come lei ha ricordato, che offre migliori prestazioni, come la conversione è fatta solo quando necessario;
  • Scollega l'applicazione dalla dipendenza di Doctrine: stai scrivendo meno codice che è specifico di Doctrine.

Un esempio di questo approccio:

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 
     ); 
    } 
} 

Questo codice sarà abbastanza facile da refactoring quando Dottrina offrirà supporto nativo VO.

proposito custom mapping types, faccio usarli come pure, per singolo settore VO (Decimal, Point, Polygon, ...), ma tenderebbe a riservare loro per general-purpose, tipi riutilizzabili che può essere utilizzato su più progetti , non per VO a campo singolo specifico del progetto, dove preferirei l'approccio di cui sopra.