В чем разница между виртуальными свойствами сериализатора и средством доступа?

#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. Да, лучшие объяснения содержат конкретный пример для иллюстративных целей. Отличный ответ. Спасибо