Новое в Symfony 5.1: Улучшения сериализатора

Добавлена аннотация @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')