Un Objet de Valeur (ou Value Object) est un petit objet qui représente une donnée (ou concept) simple et atomique. Qu’est-ce qu’un « Value Object » ? Quelques exemples : monnaie, devise, coordonnées 2D, coordonnées 3D, adresse postale, volume, distance, adresse e-mail, élément chimique, date, intervalle de date, numéro de téléphone, UUID, etc.
Entité Doctrine + Value Object class Order { // ... public function pay(Money $paidAmount) { if (self::PAID === $this->status) { throw new OrderAlreadyPaidException(); } if (!$paidAmount->equals($this->totalAmount)) { throw new OrderPartiallyPaidException(); } $this->status = self::PAID; } }
namespace Money\Doctrine; use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Types\Type; class MoneyType extends Type { function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) { return $platform->getVarcharTypeDeclarationSQL($fieldDeclaration); } function requiresSQLCommentHint(AbstractPlatform $platform) { return true; } function getName() { return 'money'; } }
Avantages vs inconvénients + Simplicité de mise en place + Approche entièrement objet - Une seule colonne SQL de stockage - Requêtes SQL d’aggrégation impossible
Doctrine 2.5 vient avec le mécanisme des entités imbriquées qui permet de stocker (et récupérer) automatiquement des sous-entités dans la même table SQL que l’entité principale. Depuis Doctrine 2.5