Сделайте так, чтобы JMS Serializer не заполнял нулевые значения вместо значений по умолчанию

JMS Serializer 1.* при десериализации заполняет только те поля, которые предоставлены во входных данных. Например, у нас есть такой код:

$criteria = $this->serializer->deserialize($request->getContent(), SearchCriteria::class, 'json');

И когда нет поля limit в запросе он принимает значение по умолчанию, определенное в свойстве класса, т.е.

class SearchCriteria {
    // ...
    private $limit = 10;
    // ...
}

Это поведение изменилось после перехода на JMS Serializer 2.0 - теперь оно переопределяет limit поле с нулем, что нарушает нашу логику. Есть ли способ настроить старое поведение? Мы используем Symfony 4 с jms/serializer-bundle@3.0.0.

Вот jms_serializer.yaml:

jms_serializer:
    default_context:
        serialization:
            serialize_null: false
        deserialization:
            serialize_null: false

1 ответ

Так что лучший обходной путь, который я нашел до сих пор, - это использование аннотации PostDeserialize ( https://jmsyst.com/libs/serializer/master/reference/annotations) и ручная установка значений по умолчанию, например:

/**
 * @JMS\PostDeserialize()
 */
public function postDeserialize()
{
    $this->limit = $this->limit ?? 10;
}

Это выглядит некрасиво, но работает.

Другие вопросы по тегам