New in Symfony 5.3: Inlined Serialization Context

Symfony 5.3 is backed by JoliCode. JoliCode is a team of passionate developers and open-source lovers, with a strong expertise in PHP & Symfony technologies. They can help you build your projects using state-of-the-art practices.

Contributed by
Maxime Steinhausser
in #39399.

The Serializer component provides a mechanism to configure the way data is serialized/deserialized: the context options. These options are passed as an optional argument of the serialize/deserialize methods.

In Symfony 5.3 we’ve improved the serializer so you can define the context as part of the mapping information thanks to a new Serializer\Context annotation/attribute.

For example, to define how some datetime property should be formatted, use the following:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
use Symfony\Component\Serializer\Annotation as Serializer;
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;

class SomeClass
{
    /**
     * @Serializer\Context({ DateTimeNormalizer::FORMAT_KEY = 'Y-m-d' })
     */
    public \DateTime $date;

    // In PHP 8 applications you can use PHP attributes instead:
    #[Serializer\Context([DateTimeNormalizer::FORMAT_KEY => 'Y-m-d'])]
    public \DateTime $date;
}

The annotation/attribute supports different contexts for normalization/denormalization and it can also define serialization groups:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#[Serializer\Context(
    normalizationContext: [DateTimeNormalizer::FORMAT_KEY => 'Y-m-d'],
    denormalizationContext: [DateTimeNormalizer::FORMAT_KEY => \DateTime::COOKIE]
)]
public \DateTime $date;

#[Serializer\Context(
    normalizationContext: [DateTimeNormalizer::FORMAT_KEY => \DateTime::RFC3339],
    groups: ['extended']
)]
public \DateTime $date;
Help the Symfony project!

As with any Open-Source project, contributing code or documentation is the most common way to help, but we also have a wide range of sponsoring opportunities.

Comments

This is so useful, thanks 😊
Thanks, I was waiting for a long time to have a feature like this for the serializer. Thanks
A few weeks ago, I was literally thinking "if only you could define the context via an annotation, this would be so much simpler". This rocks.
Chinese translation of this article (本文中文翻译): https://phpzlc.gitee.io/blog/6.html

Comments are closed.

To ensure that comments stay relevant, they are closed for old posts.