可嵌入的教义

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代码详解(-)-从数据处理到嵌入包含数据集可构造/数据嵌入和位置嵌入的详解

Transformer代码详解(-)-从数据处理到嵌入包含数据集可构造/数据嵌入和位置嵌入的详解

在 C# 程序中嵌入外部可执行文件