可嵌入的教义
Posted
技术标签:
【中文标题】可嵌入的教义【英文标题】:Doctrine embeddable 【发布时间】:2017-01-31 16:38:35 【问题描述】:我正在尝试为值对象实现学说2 可嵌入功能。
这是简单的sn-p,稍作修改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;
当我尝试从嵌入对象访问属性时,我收到“无法访问受保护的属性”错误 - 这是预期的。 可嵌入对象应该只能由它们的基实体类读取,并且不能修改,因为它们是不可变的(遵循领域驱动的设计指南)。 我不明白的是,由于它们是私有/受保护的,我该如何读取它们的属性?这里有什么 php 魔法吗?我试图使用不同的吸气剂,例如:
getStreet(Address $address)
$this->street = $address->street;
但在实体管理器实例上调用持久和刷新方法之前总是会出错。
谢谢。
【问题讨论】:
为什么要在您的用户类中创建一个名为 street 的列/属性?地址当然已经有了。 合法问题,但你不能假设它是相同的“街道”概念,而不知道他/她试图建模的领域。无论如何,我同意这是令人困惑的,它应该得到一个更好的名字。 【参考方案1】:在嵌入式类上使用getters
。
class Address
...
public function getStreet()
return $this->street;
...
然后,你的方法改变了
getStreet(Address $address)
$this->street = $address->getStreet();
【讨论】:
【参考方案2】:如果你想从一个用户开始检索街道值,你应该在 User 类中创建一个 getter 方法,该方法在内部可以访问该地址并执行以下操作:
class User
public getAddressStreet()
$this->address->getStreet();
或类似的东西。
【讨论】:
以上是关于可嵌入的教义的主要内容,如果未能解决你的问题,请参考以下文章
Transformer代码详解(-)-从数据处理到嵌入包含数据集可构造/数据嵌入和位置嵌入的详解
Transformer代码详解(-)-从数据处理到嵌入包含数据集可构造/数据嵌入和位置嵌入的详解
Transformer代码详解(-)-从数据处理到嵌入包含数据集可构造/数据嵌入和位置嵌入的详解
Transformer代码详解(-)-从数据处理到嵌入包含数据集可构造/数据嵌入和位置嵌入的详解