2017-01-31 5 views
-1

J'essaie d'implémenter doctrine2 embarquable fonctionnalité pour les objets de valeur.Doctrine embeddable

Ceci est extrait simple, légèrement modifié from doctrine official documentation:

/** @Entity */ 
class User 
{ 
    /** @Embedded(class = "Address") */ 
    protected $address; 
    /** @Column(type = "string") */ 
    protected $street; 
} 

/** @Embeddable */ 
class Address 
{ 
    /** @Column(type = "string") */ 
    protected $street; 

    /** @Column(type = "string") */ 
    protected $postalCode; 

    /** @Column(type = "string") */ 
    protected $city; 

    /** @Column(type = "string") */ 
    protected $country; 
} 

Lorsque je tente d'accéder à la propriété d'objet incorporé, je reçois « ne peut pas accès à une propriété protégée » erreur - qui est prévu. Les objets incorporables doivent être lus uniquement par leur classe d'entité de base, et non modifiés puisqu'ils sont immuables (suivant les directives de conception pilotées par domaine). Ce que je ne comprends pas, c'est comment puis-je lire leurs propriétés puisqu'elles sont privées/protégées? Y a-t-il de la magie PHP impliquée ici? Je tentais d'utiliser différents apporteurs comme:

getStreet(Address $address){ 
    $this->street = $address->street; 
} 

mais toujours obtenir l'erreur, avant d'appeler persistent et les méthodes de chasse sur l'instance gestionnaire d'entités.

Merci.

+0

Pourquoi ferait une colonne/propriété appelée rue dans votre classe d'utilisateur? L'adresse du cours en a déjà un. – Cerad

Répondre

0

Utilisez getters dans la classe incorporée.

class Address 
{ 
    ... 
    public function getStreet(){ 
     return $this->street; 
    } 
    ... 
} 

Ensuite, votre méthode change

getStreet(Address $address){ 
    $this->street = $address->getStreet(); 
}