根据Serializer virtualProperty文档
注意:这仅适用于序列化,在反序列化期间完全被忽略。
除了这个限制,使用virtualProperty和accessor有什么区别?
如果没有,为什么会想要使用它,因为accessor没有这个限制。
最佳解释有一个具体的例子用于说明目的。因此,我将尝试举例说明使用virtualProperty
和accessor
来显示它们之间的差异。
我们有一个实体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方法。默认情况下,getBirthdate
和setBirthdate
将被使用。但是,我们希望使用getFormattedBirthdate
进行序列化。
VirtualProperty帮助我们显示计算的年龄。它将在序列化期间使用。因为它不是一个真正的属性,它没有setter,反序列化是没有意义的。
我希望这个例子有助于理解Accessor和VirtualProperty之间的区别。