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

问题描述 投票:0回答:1

根据Serializer virtualProperty文档

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

除了这个限制,使用virtualPropertyaccessor有什么区别?

如果没有,为什么会想要使用它,因为accessor没有这个限制。

php symfony serialization jmsserializerbundle jms-serializer
1个回答
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帮助我们显示计算的年龄。它将在序列化期间使用。因为它不是一个真正的属性,它没有setter,反序列化是没有意义的。

我希望这个例子有助于理解Accessor和VirtualProperty之间的区别。

© www.soinside.com 2019 - 2024. All rights reserved.