Nuevo en Symfony 5.1: Mejoras en el serializador

Añadida la anotación @Ignore

Symfony 5.1 añade una anotación llamada @Ignore para indicar los valores que se deben ignorar al serializar. Puedes aplicar la anotación tanto a propiedades como a métodos:

use Symfony\Component\Serializer\Annotation\Ignore;
 
class SomeClass
{
    public $someProperty;
    /**
     * @Ignore()
     */
    public $anotherProperty;
    private $lastProperty;
 
    /**
     * @Ignore()
     */
    public function getLastProperty()
    {
        return $this->lastProperty;
    }
}

El equivalente en los formatos YAML y XML es la opción 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>

Esta funcionalidad fue contribuida por Kévin Dunglas en el pull request #28744.

Denormalizador selectivo

Las API suelen devolver respuestas de las que solo necesitas un objeto que está dentro de otros objetos. En Symfony 5.1, gracias al nuevo UnwrappingDenormalizer puedes acceder a esos objetos anidados sin tener que crear clases intermedias:

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'

Esta funcionalidad fue contribuida por Eduard Bulava en el pull request #31390.

Añadido soporte para stdClass

Cuando un objeto contiene valores de tipo stdClass de PHP, la serialización no funciona. En Symfony 5.1 hemos añadido soporte para esa clase:

$object = new \stdClass();
$object->foo = 'f';
$object->bar = 'b';
 
$normalizer->normalize($object) === ['foo' => 'f', 'bar' => 'b']

Esta funcionalidad fue contribuida por Kévin Dunglas en el pull request #35596.

Denormalización escalar

Symfony 5.1 también añade soporte para denormalizar valores escalares, que son los números (int o float), booleanos y cadenas de texto:

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')

Esta funcionalidad fue contribuida por Alexander Menshchikov en el pull request #35235.


Fuente: New in Symfony 5.1: Serializer improvements

Comentarios

Publicada el

30 de abril de 2020

Etiquetas

Proyectos Symfony destacados

La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.