New in Symfony 6.1: Serializer Context Builders

Contributed by Mathias Arlaud in #43973.

The Serializer component allows you to pass some context information to the serializing and deserializing process. For example, to ignore certain attributes when serializing, you can use the following code:

    $serializer->serialize($person, 'json', ['ignored_attributes' => ['age']]);

// Symfony also defines public constants for the names of all context options $serializer->serialize($person, 'json', [AbstractNormalizer::IGNORED_ATTRIBUTES => ['age']]);

In Symfony 6.1 we're improving the definition of serialization contexts with the introduction of Context Builders. Instead of having to deal with plain arrays, these objects allow you to define the context using a fluent interface which provides autocompletion, validation and documentation. As shown in this example, you can mix both arrays and builder objects and you can even merge these context objects between them:

    use Symfony\Component\Serializer\Context\Encoder\CsvEncoderContextBuilder;

use Symfony\Component\Serializer\Context\Normalizer\ObjectNormalizerContextBuilder;

$initialContext = [ 'custom_key' => 'custom_value', ];

$contextBuilder = (new ObjectNormalizerContextBuilder()) ->withContext($initialContext) ->withGroups(['group1', 'group2']);

$contextBuilder = (new CsvEncoderContextBuilder()) ->withContext($contextBuilder) ->withDelimiter(';');

$serializer->serialize($something, 'csv', $contextBuilder->toArray());

If you need the context as a plain array (e.g. to pass it to serialize() method) call to the toArray() method:

    $this->serializer->serialize($data, 'csv', $contextBuilder->toArray());

When building your own context builder, consider using the Symfony\Component\Serializer\Context\ContextBuilderTrait to reuse some common methods:

    // src/Serializer/LegacyContextBuilder

namespace App\Serializer;

use Symfony\Component\Serializer\Context\ContextBuilderInterface; use Symfony\Component\Serializer\Context\ContextBuilderTrait;

final class LegacyContextBuilder implements ContextBuilderInterface { use ContextBuilderTrait;

public function withNullableDates(bool $nullable = true): static
{
    return $this->with('zero_datetime_to_null', $nullable);
}

}

// you can now use this context builder as follows: // $context = (new LegacyContextBuilder())->withNullableDates();

                Sponsor the Symfony project.

https://symfony.com/blog/new-in-symfony-6-1-serializer-context-builders?utm_source=Symfony%20Blog%20Feed&utm_medium=feed

Created 3y | Apr 27, 2022, 1:20:14 PM


Login to add comment

Other posts in this group

Symfony UX CVE-2025-47946: Unsanitized HTML attribute injection via ComponentAttributes

Affected versions

Symfony UX symfony/ux-live-component and symfony/ux-twig-component versions <2.25.1 are affected by this security issue.

The issue has been fixed in the 2.25.1 version of these

May 19, 2025, 12:40:14 PM | Symfony
New in Symfony 7.3: Yaml Improvements

Symfony has been reducing the need for configuration in applications for several years now. Thanks to PHP attributes, you can now configure most things alongside the relevant code, removing the need f

May 19, 2025, 8:10:09 AM | Symfony
A Week of Symfony #959 (May 12–18, 2025)

This week, development activity focused on polishing Symfony 7.3 ahead of its final release in two weeks. We also continued publishing articles highlighting the new features of Symfony 7.3 and shared

May 18, 2025, 8:50:08 AM | Symfony
SymfonyOnline June 2025:  Keynote “Symfony in 2025, Scaling to Zero.”

SymfonyOnline June 2025 is almost here, starting in a few weeks on:

June 10-11: Workshop days. June 12-13: Online conference days in English. All talks will be available for replay as soon as

May 16, 2025, 3:10:26 PM | Symfony
New in Symfony 7.3: Dependency Injection Improvements

Symfony 7.3 introduces several enhancements to the DependencyInjection component that simplify service configuration, make autoconfiguration more flexible, and enable environment-specific aliasing.

S

May 16, 2025, 8:10:11 AM | Symfony
New in Symfony 7.3: Namespaced Caches

Contributed by Nicolas Grekas in

May 15, 2025, 8:50:14 AM | Symfony
SymfonyOnline June 2025: Building an Automated Trading System with Symfony

SymfonyOnline June 2025 is almost here, starting in almost 2 months on:

June 10-11: Workshop days. It is possible to attend 1 two-day training or 2 one-day trainings. June 12-13: Online confe

May 14, 2025, 2:30:11 PM | Symfony