【发布时间】:2019-08-07 09:49:53
【问题描述】:
根据序列化程序 virtualProperty 文档
注意:这仅适用于序列化,完全被忽略 在反序列化期间。
除此限制外,使用virtualProperty 和accessor 有什么区别?
如果没有,为什么要使用它,因为accessor 没有这个限制。
【问题讨论】:
标签: php symfony serialization jmsserializerbundle jms-serializer
根据序列化程序 virtualProperty 文档
注意:这仅适用于序列化,完全被忽略 在反序列化期间。
除此限制外,使用virtualProperty 和accessor 有什么区别?
如果没有,为什么要使用它,因为accessor 没有这个限制。
【问题讨论】:
标签: php symfony serialization jmsserializerbundle jms-serializer
最好的解释有一个用于说明目的的具体示例。因此,我将尝试举例说明同时使用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 帮助我们显示计算出的年龄。它将在序列化期间使用。因为它不是真正的属性,所以它没有设置器,反序列化它没有意义。
我希望该示例有助于理解 Accessor 和 VirtualProperty 之间的区别。
【讨论】: