我正在尝试为值对象实现 doctrine2 可嵌入功能。
这是简单的片段,根据教义官方文档略有修改:
/** @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;
}
当我尝试从嵌入对象访问属性时,我收到"无法访问受保护的属性"错误 - 这是意料之中的。可嵌入对象应仅由其基实体类读取,并且不应修改,因为它们是不可变的(遵循域驱动的设计准则)。我不明白的是,由于它们是私有/受保护的,我如何读取它们的属性?这里涉及任何PHP魔法吗?我试图使用不同的 getter,例如:
getStreet(Address $address){
$this->street = $address->street;
}
但在实体管理器实例上调用持久和刷新方法之前,总是会出现错误。
谢谢。
从用户开始检索街道值,则应在 User 类中创建一个 getter 方法,该方法在内部可以访问该地址并执行以下操作:
class User
{
public getAddressStreet() {
$this->address->getStreet();
}
}
或类似的东西。
在嵌入式类上使用getters
。
class Address
{
...
public function getStreet(){
return $this->street;
}
...
}
然后,您的方法会更改
getStreet(Address $address){
$this->street = $address->getStreet();
}