Добавлена аннотация @Ignore
В Symfony 5.1 добавлена новая аннотация @Ignore
, позволяющая игнорировать некоторые значения при сериализации. Вы можете применить аннотацию как к свойствам, так и к методам.
Пример:
use Symfony\Component\Serializer\Annotation\Ignore;
class SomeClass
{
public $someProperty;
/**
* @Ignore()
*/
public $anotherProperty;
private $lastProperty;
/**
* @Ignore()
*/
public function getLastProperty()
{
return $this->lastProperty;
}
}
Это также доступно в форматах YAML
и XML
, используя опцию ignore
:
App\SomePath\SomeClas:
attributes:
# ...
anotherProperty:
ignore: true
lastProperty:
ignore: true
<class name="App\SomePath\SomeClass">
<!-- ... -->
<attribute name="anotherProperty" ignore="true" />
<attribute name="lastProperty" ignore="true" />
</class>
Развертывание денормализатора
API часто возвращают вложенные ответы, в которых вам нужен только некоторый дочерний объект. В Symfony 5.1 благодаря новому UnwrappingDenormalizer
вы можете получить любой вложенный объект без создания ненужных классов моделей:
use Symfony\Component\Serializer\Normalizer\UnwrappingDenormalizer;
$result = $serialiser->deserialize(
'{"baz": {"foo": "bar", "inner": {"title": "value", "numbers": [5,3]}}}',
Object::class,
[UnwrappingDenormalizer::UNWRAP_PATH => '[baz][inner]']
);
// $result->title === 'value'
Добавлена поддержка stdClass
Когда объект содержит свойства PHP stdClass
, сериализация завершается ошибкой. В Symfony 5.1 добавили поддержку для этого:
$object = new \stdClass();
$object->foo = 'f';
$object->bar = 'b';
$normalizer->normalize($object) === ['foo' => 'f', 'bar' => 'b']
Скалярная денормализация
В Symfony 5.1 также добавили поддержку денормализации скалярных значений. Этими скалярными значениями являются числа (int
или float
), логические значения и строки. В следующем примере показано, как можно нормализовать и денормализовать эти значения:
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer;
use Symfony\Component\Serializer\Serializer;
$serializer = new Serializer([], ['json' => new JsonEncoder()]);
'42' === $serializer->serialize(42, 'json')
'true' === $serializer->serialize(true, 'json')
'3.14' === $serializer->serialize(3.14, 'json')
'foo bar' === $serializer->serialize('foo bar', 'json')
$serializer = new Serializer(
[new ArrayDenormalizer()],
['json' => new JsonEncoder()]
);
[42] === $serializer->deserialize('[42]', 'int[]', 'json')
[true, false] === $serializer->deserialize('[true,false]', 'bool[]', 'json')
[3.14] === $serializer->deserialize('[3.14]', 'float[]', 'json')
['foo bar'] === $serializer->deserialize('["foo bar"]', 'string[]', 'json')