2011-12-09 20 views
8

He estado implementando objetos de valor como tipos de DBAL personalizados en Doctrine 2 y ha estado funcionando bien. Sin embargo, me he estado preguntando si esta es la mejor manera. He pensado en usar el oyente de Post Load para crear una instancia de los objetos de valor. También instanciarlos a través de accesadores de entidad cuando se solicite, la ventaja con este último sería que no instanciaría más objetos de los que necesito.Doctrine 2 Value Objects

Mi pregunta es: ¿qué método es el mejor? ¿O hay una mejor manera de hacerlo? ¿Hay algún truco o resultados irracionales de rendimiento con lo anterior?

Respuesta

8

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.