可以入侵的学说

时间:2017-01-31 16:38:36

标签: php doctrine domain-driven-design value-objects embeddable

我正在尝试为值对象实现doctrine2 embeddable 功能。

这是一个简单的代码片段,略有修改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;
}

但在实体管理器实例上调用persist和flush方法之前总是会出错。

感谢。

2 个答案:

答案 0 :(得分:0)

在嵌入式课程中使用getters

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

然后,您的方法会更改

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

答案 1 :(得分:0)

如果要从用户处检索街道值,则应在User类中创建一个getter方法,该方法在内部可以访问该地址并执行以下操作:

class User
{
    public getAddressStreet() {
        $this->address->getStreet();
    }
}

或类似的东西。