序列化程序virtualProperty和访问器之间有什么区别?

时间:2019-03-16 13:38:56

标签: php symfony serialization jmsserializerbundle jms-serializer

根据序列化程序virtualProperty文档

  

注意:这仅适用于序列化,将被完全忽略   在反序列化期间。

除了此限制之外,使用virtualPropertyaccessor有什么区别?

如果什么也没有,为什么要使用它,因为accessor没有此限制。

1 个答案:

答案 0 :(得分:3)

最佳说明中有一个具体的例子用于说明。因此,我将尝试举一个同时使用virtualPropertyaccessor来显示它们之间差异的示例。

我们有一个实体Person,它具有许多不同的属性。其中之一是birthdate。让我们来看一个例子:

class Person
{
    /**
     * @Accessor(getter="getFormattedBirthdate", setter="setBirthdate")
     */
    private $birthdate;

    public function setBirthdate(\DateTimeInterface $birthdate): self
    {
        $this->birthdate = $birthdate;

        return $this;
    }

    public function getBirthdate(): \DateTimeInterface
    {
        return $this->birthdate;
    }

    public function getFormattedBirthdate(): string
    {
        return $this->birthdate->format('j F Y');
    }

    /**
     * @VirtualProperty()
     */
    public function getAge(): int
    {
        $today = new \DateTime('today');
        $age = $today->diff($this->birthdate);

        return $age->y;
    }
}

我们使用 Accessor 指定在序列化和反序列化期间分别使用哪种getter和setter方法。默认情况下,将使用getBirthdatesetBirthdate。但是,我们希望使用getFormattedBirthdate进行序列化。

VirtualProperty 帮助我们显示计算出的年龄。它将在序列化期间使用。因为它不是不动产,所以它没有设置方法,反序列化也没有意义。

我希望该示例有助于理解 Accessor VirtualProperty 之间的区别。