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
Proyectos Symfony destacados
La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más
Síguenos en @symfony_es para acceder a las últimas noticias.