How to Use the Serializer

Symfony provides a serializer to serialize/deserialize to and from objects and different formats (e.g. JSON or XML). Before using it, read the Serializer component docs to get familiar with its philosophy and the normalizers and encoders terminology.

Symfony は、オブジェクトやさまざまな形式 (JSON や XML など) との間でシリアル化/逆シリアル化するためのシリアライザーを提供します。使用する前に、Serializer コンポーネントのドキュメントを読んで、その原理とノーマライザーとエンコーダーの用語を理解してください。

Installation

In applications using Symfony Flex, run this command to install the serializer Symfony pack before using it:

Symfony Flex を使用するアプリケーションでは、次のコマンドを実行してシリアライザー Symfony パックを使用する前にインストールします。
1
$ composer require symfony/serializer-pack

Using the Serializer Service

Once enabled, the serializer service can be injected in any service where you need it or it can be used in a controller:

シリアライザー サービスを有効にすると、必要なサービスに挿入したり、コントローラーで使用したりできます。
1
2
3
4
5
6
7
8
9
10
11
12
13
// src/Controller/DefaultController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Serializer\SerializerInterface;

class DefaultController extends AbstractController
{
    public function index(SerializerInterface $serializer)
    {
        // keep reading for usage examples
    }
}

Or you can use the serialize Twig filter in a template:

または、テンプレートでシリアル化 Twig フィルターを使用できます。
1
{{ object|serialize(format = 'json') }}

See the twig reference for more information.

詳細については、小枝のリファレンスを参照してください。

Adding Normalizers and Encoders

Once enabled, the serializer service will be available in the container. It comes with a set of useful encoders and normalizers.

有効にすると、シリアライザー サービスがコンテナーで使用できるようになります。これには、一連の便利なエンコーダーとノーマライザーが付属しています。

Encoders supporting the following formats are enabled:

次の形式をサポートするエンコーダーが有効になっています。

As well as the following normalizers:

以下のノーマライザーと同様に:

Other built-in normalizers and custom normalizers and/or encoders can also be loaded by tagging them as serializer.normalizer and serializer.encoder. It's also possible to set the priority of the tag in order to decide the matching order.

その他の組み込みノーマライザー、カスタム ノーマライザー、および/またはエンコーダーも、asserializer.normalizer およびserializer.encoder にタグ付けすることでロードできます。また、タグの優先順位を設定して、一致順序を決定することもできます。

Caution

注意

Always make sure to load the DateTimeNormalizer when serializing the DateTime or DateTimeImmutable classes to avoid excessive memory usage and exposing internal details.

DateTime クラスまたは DateTimeImmutable クラスをシリアル化するときは、常に DateTimeNormalizer をロードして、過度のメモリ使用と内部詳細の公開を回避してください。

Serializer Context

The serializer can define a context to control the (de)serialization of resources. This context is passed to all normalizers. For example:

シリアライザーは、リソースの (デ) シリアライゼーションを制御するコンテキストを定義できます。このコンテキストは、すべてのノーマライザーに渡されます。例えば:
  • DateTimeNormalizer uses datetime_format key as date time format;
    DateTimeNormalizer は datetime_format キーを日時形式として使用します。
  • AbstractObjectNormalizer uses preserve_empty_objects to represent empty objects as {} instead of [] in JSON.
    AbstractObjectNormalizer は、preserve_empty_objects を使用して、空のオブジェクトを JSON の [] ではなく {} として表します。
  • Serializer uses empty_array_as_object to represent empty arrays as {} instead of [] in JSON.
    シリアライザは、空の配列を JSON の [] ではなく {} として表すために empty_array_as_object を使用します。

You can pass the context as follows:

次のようにコンテキストを渡すことができます。
1
2
3
4
5
6
7
$serializer->serialize($something, 'json', [
    DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s',
]);

$serializer->deserialize($someJson, Something::class, 'json', [
    DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s',
]);

You can also configure the default context through the framework configuration:

フレームワーク構成を介してデフォルトのコンテキストを構成することもできます。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
# config/packages/framework.yaml
framework:
    # ...
    serializer:
        default_context:
            enable_max_depth: true
            yaml_indentation: 2

6.2

6.2

The option to configure YAML indentation was introduced in Symfony 6.2.

YAML インデントを設定するオプションは、Symfony 6.2 で導入されました。

You can also specify the context on a per-property basis:

プロパティごとにコンテキストを指定することもできます。
  • Annotations
    注釈
  • Attributes
    属性
  • YAML
    YAML
  • XML
    XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace App\Model;

use Symfony\Component\Serializer\Annotation\Context;
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;

class Person
{
    /**
     * @Context({ DateTimeNormalizer::FORMAT_KEY = 'Y-m-d' })
     */
    public $createdAt;

    // ...
}

Use the options to specify context specific to normalization or denormalization:

オプションを使用して、正規化または非正規化に固有のコンテキストを指定します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace App\Model;

use Symfony\Component\Serializer\Annotation\Context;
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;

class Person
{
    #[Context(
        normalizationContext: [DateTimeNormalizer::FORMAT_KEY => 'Y-m-d'],
        denormalizationContext: [DateTimeNormalizer::FORMAT_KEY => \DateTime::RFC3339],
    )]
    public $createdAt;

    // ...
}

You can also restrict the usage of a context to some groups:

コンテキストの使用を一部のグループに制限することもできます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace App\Model;

use Symfony\Component\Serializer\Annotation\Context;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;

class Person
{
    #[Groups(['extended'])]
    #[Context([DateTimeNormalizer::FORMAT_KEY => \DateTime::RFC3339])]
    #[Context(
        context: [DateTimeNormalizer::FORMAT_KEY => \DateTime::RFC3339_EXTENDED],
        groups: ['extended'],
    )]
    public $createdAt;

    // ...
}

The attribute/annotation can be repeated as much as needed on a single property. Context without group is always applied first. Then context for the matching groups are merged in the provided order.

属性/注釈は、単一のプロパティで必要なだけ繰り返すことができます。グループのないコンテキストは常に最初に適用されます。次に、一致するグループのコンテキストが指定された順序でマージされます。

Using Context Builders

6.1

6.1

Context builders were introduced in Symfony 6.1.

コンテキストビルダーは Symfony 6.1 で導入されました。

To define the (de)serialization context, you can use "context builders", which are objects that help you to create that context by providing autocompletion, validation, and documentation:

(デ) シリアライゼーション コンテキストを定義するには、「コンテキスト ビルダー」を使用できます。これは、オートコンプリート、検証、およびドキュメントを提供することで、そのコンテキストを作成するのに役立つオブジェクトです。
1
2
3
4
use Symfony\Component\Serializer\Context\Normalizer\DateTimeNormalizerContextBuilder;

$contextBuilder = (new DateTimeNormalizerContextBuilder())->withFormat('Y-m-d H:i:s');
$serializer->serialize($something, 'json', $contextBuilder->toArray());

Each normalizer/encoder has its related context builder. To create a more complex (de)serialization context, you can chain them using the withContext() method:

各ノーマライザー/エンコーダーには、関連するコンテキスト ビルダーがあります。より複雑な (逆) シリアル化コンテキストを作成するには、withContext() メソッドを使用してそれらをチェーンできます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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());

You can also create your context builders to have autocompletion, validation, and documentation for your custom context values.

また、コンテキスト ビルダーを作成して、カスタム コンテキスト値のオートコンプリート、検証、およびドキュメントを作成することもできます。

Using Serialization Groups Attributes

You can add #[Groups] attributes to your class:

クラスに #[Groups] 属性を追加できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// src/Entity/Product.php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;

#[ORM\Entity]
class Product
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    #[Groups(['show_product', 'list_product'])]
    private $id;

    #[ORM\Column(type: 'string', length: 255)]
    #[Groups(['show_product', 'list_product'])]
    private $name;

    #[ORM\Column(type: 'integer')]
    #[Groups(['show_product'])]
    private $description;
}

You can now choose which groups to use when serializing:

シリアライズ時に使用するグループを選択できるようになりました。
1
2
3
4
5
6
7
use Symfony\Component\Serializer\Context\Normalizer\ObjectNormalizerContextBuilder;

$context = (new ObjectNormalizerContextBuilder())
    ->withGroups('show_product')
    ->toArray();

$json = $serializer->serialize($product, 'json', $context);

Tip

ヒント

The value of the groups key can be a single string, or an array of strings.

groups キーの値は、単一の文字列または文字列の配列にすることができます。

In addition to the #[Groups] attribute, the Serializer component also supports YAML or XML files. These files are automatically loaded when being stored in one of the following locations:

#[Groups] 属性に加えて、Serializer コンポーネントは YAML または XML ファイルもサポートします。これらのファイルは、次の場所のいずれかに保存されると自動的にロードされます。
  • All *.yaml and *.xml files in the config/serializer/ directory.
    config/serializer/directory 内のすべての *.yaml および *.xml ファイル。
  • The serialization.yaml or serialization.xml file in the Resources/config/ directory of a bundle;
    バンドルの Resources/config/ ディレクトリにある serialization.yaml または serialization.xml ファイル。
  • All *.yaml and *.xml files in the Resources/config/serialization/ directory of a bundle.
    バンドルの Resources/config/serialization/directory 内のすべての *.yaml および *.xml ファイル。

Using Nested Attributes

To map nested properties, use the SerializedPath configuration to define their paths using a valid PropertyAccess syntax:

ネストされたプロパティをマップするには、SerializedPath 構成を使用して、有効な PropertyAccess 構文を使用してパスを定義します。
  • Annotations
    注釈
  • Attributes
    属性
  • YAML
    YAML
  • XML
    XML
1
2
3
4
5
6
7
8
9
10
11
12
13
namespace App\Model;

use Symfony\Component\Serializer\Annotation\SerializedPath;

class Person
{
    /**
     * @SerializedPath("[profile][information][birthday]")
     */
    private string $birthday;

    // ...
}

6.2

6.2

The option to configure a SerializedPath was introduced in Symfony 6.2.

SerializedPath を設定するオプションは、Symfony 6.2 で導入されました。

Using the configuration from above, denormalizing with a metadata-aware
normalizer will write the birthday field from $data onto the Person
object:

上記の構成を使用すると、メタデータを認識するノーマライザーで非正規化すると、誕生日フィールドが $data から Person オブジェクトに書き込まれます。
1
2
3
4
5
6
7
8
9
$data = [
    'profile' => [
        'information' => [
            'birthday' => '01-01-1970',
        ],
    ],
];
$person = $normalizer->denormalize($data, Person::class, 'any'); 
$person->getBirthday(); // 01-01-1970

When using annotations or attributes, the SerializedPath can either
be set on the property or the associated _getter_ method. The SerializedPath cannot be used in combination with a SerializedName for the same property.

注釈または属性を使用する場合、SerializedPath はプロパティまたは関連する _getter_ メソッドで設定できます。 SerializedPath は、同じプロパティの SerializedName と組み合わせて使用​​することはできません。

Configuring the Metadata Cache

The metadata for the serializer is automatically cached to enhance application performance. By default, the serializer uses the cache.system cache pool which is configured using the cache.system option.

シリアライザーのメタデータは、アプリケーションのパフォーマンスを向上させるために自動的にキャッシュされます。デフォルトでは、シリアライザーは、cache.system オプションを使用して構成された cache.system キャッシュ プールを使用します。

Enabling a Name Converter

The use of a name converter service can be defined in the configuration using the name_converter option.

名前変換サービスの使用は、name_converter オプションを使用して構成で定義できます。

The built-in CamelCase to snake_case name converter can be enabled by using the serializer.name_converter.camel_case_to_snake_case value:

serializer.name_converter.camel_case_to_snake_case 値を使用して、組み込みの CamelCase から snake_case への名前コンバーターを有効にすることができます。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
# config/packages/framework.yaml
framework:
    # ...
    serializer:
        name_converter: 'serializer.name_converter.camel_case_to_snake_case'

Going Further with the Serializer

API Platform provides an API system supporting the following formats:

API Platform は、次の形式をサポートする API システムを提供します。

It is built on top of the Symfony Framework and its Serializer component. It provides custom normalizers and a custom encoder, custom metadata and a caching system.

これは、Symfony フレームワークとその Serializer コンポーネントの上に構築されています。カスタム ノーマライザーとカスタム エンコーダー、カスタム メタデータとキャッシュ システムを提供します。

If you want to leverage the full power of the Symfony Serializer component, take a look at how this bundle works.

Symfony Serializer コンポーネントの全機能を活用したい場合は、このバンドルがどのように機能するかをご覧ください。