Сделайте так, чтобы 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;
}
Это выглядит некрасиво, но работает.