#php #symfony #serialization #jmsserializerbundle #jms-serializer
#php #symfony #сериализация #jmsserializerbundle #jms-сериализатор
Вопрос:
Согласно документации по виртуальным свойствам сериализатора
Примечание: Это работает только для сериализации и полностью игнорируется во время десериализации.
Кроме этого ограничения, в чем разница между использованием виртуального свойства и средства доступа?
Если ничего, то зачем его использовать, поскольку у средства доступа нет этого ограничения.
Ответ №1:
Лучшие объяснения содержат конкретный пример для иллюстративных целей. Поэтому я попытаюсь привести пример использования обоих 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;
}
}
Мы используем средство доступа, чтобы указать, какой метод получения и установки будет использоваться во время сериализации и десериализации соответственно. По умолчанию использовался бы getBirthdate
и setBirthdate
. Однако мы хотели бы использовать getFormattedBirthdate
для сериализации.
VirtualProperty помогает нам отображать вычисленный возраст. Оно будет использоваться во время сериализации. Поскольку это не реальное свойство, у него нет установщика, и нет смысла десериализовывать его.
Я надеюсь, что пример помогает понять разницу между средством доступа и VirtualProperty.
Комментарии:
1. Да, лучшие объяснения содержат конкретный пример для иллюстративных целей. Отличный ответ. Спасибо