Doctrine: Value Objects

Martin Fowler define un Value Object como:

a small object such as a Money or date range object. Their key property is that they follow value semantics rather than reference semantics.

Si usamos Value Objects en nuestro modelo y usamos Doctrine, ahora mismo no hay soporte por parte de la librería para poder trabajar y persistir estos objetos. Pero hay un Pull Request que lleva dando vueltas un tiempo, y que finalmente parece que está casi listo, para añadir esta funcionalidad a Doctrine. Esto nos permitirá en vez de tener en una entidad varios atributos que hacen referencia al mismo concepto, unirlos y tener un Value Object.

Cuando se añada esta funcionalidad y según la documentación que se ha añadido en el Pull Request, la forma de usar Value Object será la siguiente:

Tenemos una entity User que contiene varios campos que hacen referencia a una dirección (calle, código postal, ciudad y país) y lo que nos permite es poder definir una clase como Embeddable:

Y en nuestra entity User añadimos:

De esta forma tenemos separados la dirección del usuario. A nivel de persistencia se guardarán estos campos dentro de la tabla User.

Lo interesante de esto es que también podemos usar DQL:

Ahora queda ver cuando estará disponible esta funcionalidad, pero mientras tanto también existe una librería en pruebas creada por Matthias Noback y el bundle correspondiente.