シリアライザーの使い方


オブジェクトと異なる形式 (JSON や XML など) の間のシリアル化と逆シリアル化は、非常に複雑なトピックです。 Symfony には、必要に応じて使用できるいくつかのツールを提供する Serializer コンポーネント が付属しています。

実際、使用を開始する前に、まずシリアライザー、ノーマライザー、エンコーダーについてよく理解し、記事 シリアライザー コンポーネント を読んでください。

シリアライザーのアクティブ化

serializer サービスはデフォルトでは利用できません。これを有効にするには、構成ファイルで有効にします。

PHP:// app/config/config.php$container->loadFromExtension('framework', array(
    // ...
    'serializer' => array(
        'enabled' => true,
    ),));
XML:<!-- app/config/config.xml --><?xml version="1.0" encoding="UTF-8" ?><container xmlns="http://symfony.com/schema/dic/services"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:framework="http://symfony.com/schema/dic/symfony"    xmlns:twig="http://symfony.com/schema/dic/twig"    xsi:schemaLocation="http://symfony.com/schema/dic/services        http://symfony.com/schema/dic/services/services-1.0.xsd        http://symfony.com/schema/dic/symfony        http://symfony.com/schema/dic/symfony/symfony-1.0.xsd        http://symfony.com/schema/dic/twig        http://symfony.com/schema/dic/twig/twig-1.0.xsd">
    <framework:config>
        <!-- ... -->
        <framework:serializer enabled="true" />
    </framework:config></container>
YAML:# app/config/config.ymlframework:    # ...
    serializer:
        enabled: true

シリアライザー サービスを使用します

有効にすると、シリアライザー サービスは、必要なときに任意のサービスに挿入したり、次のようにコントローラーで使用したりできます:

// src/AppBundle/Controller/DefaultController.phpnamespace AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class DefaultController extends Controller{
    public function indexAction()
    {
        $serializer = $this->get('serializer');         // ...
    }}

ノーマライザーとエンコーダーの追加

有効にすると、serializer がコンテナ内で使用可能になり、2 つの エンコーダ (JsonEncoder#) がロードされます。 ##XmlEncoder) と ObjectNormalizer ノーマライザー

ノーマライザーやエンコーダーを読み込むには、

serializer.normalizer および serializer.encoder でタグ付けします。タグの優先順位を設定して、一致する順序を決定することもできます。

次の例は、

GetSetMethodNormalizer をロードする方法を示しています:

PHP:// app/config/services.phpuse Symfony\Component\DependencyInjection\Definition; $definition = new Definition(
    'Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer'));$definition->setPublic(false);$definition->addTag('serializer.normalizer');$container->setDefinition('get_set_method_normalizer', $definition);
XML:<!-- app/config/services.xml --><services>
    <service id="get_set_method_normalizer" class="Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer" public="false">
        <tag name="serializer.normalizer" />
    </service></services>

YAML:# app/config/services.ymlservices:
    get_set_method_normalizer:
        class: Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer
        public: false
        tags:
            - { name: serializer.normalizer }

シリアル化されたグループ アノテーションを使用する

次の構成により、シリアル化されたグループ アノテーションを有効にします:

PHP:// app/config/config.php$container->loadFromExtension('framework', array(
    // ...
    'serializer' => array(
        'enable_annotations' => true,
    ),));
XML:<!-- app/config/config.xml --><framework:config>
    <!-- ... -->
    <framework:serializer enable-annotations="true" /></framework:config>
YAML:# app/config/config.ymlframework:    # ...
    serializer:
        enable_annotations: true

次に、

@Goups を追加します。アノテーションをクラスに追加し、シリアル化するときに、使用するグループを選択します:

$serializer = $this->get('serializer');$json = $serializer->serialize(
    $someObject,
    'json', array('groups' => array('group1')));

@Groups アノテーションに加えて、シリアライザー コンポーネントは Yaml または Xml もサポートします。ファイル。これらのコンポーネントは、次の場所に保存されると自動的にロードされます:

  • serialization は、バンドルの下の Resources/config/ ディレクトリに保存されます。 yml または serialization.xml;

  • すべて # バンドル ## の

    Resources/config/serialization/ ディレクトリに保存されます*.yml および *.xml

  • メタデータ キャッシュを有効にする

シリアライザー コンポーネントによって使用されるグループなどのメタデータをキャッシュして、プログラムのパフォーマンスを向上させることができます。

Doctrine\Common\Cache\Cache

インターフェースを実装する任意のサービスを使用できます。

APCu

を利用するサービスがフレームワークに組み込まれています:

PHP:// app/config/config_prod.php$container->loadFromExtension('framework', array(
    // ...
    'serializer' => array(
        'cache' => 'serializer.mapping.cache.apc',
    ),));
XML:<!-- app/config/config_prod.xml --><framework:config>
    <!-- ... -->
    <framework:serializer cache="serializer.mapping.cache.apc" /></framework:config>
YAML:# app/config/config_prod.ymlframework:    # ...
    serializer:
        cache: serializer.mapping.cache.apc
ネーミングコンバータを開く

##2.8

name_converter オプションは、Symfony 2.8 から導入されました。

name Converter
サービスを使用するには、構成ファイルの

name_converter オプションを使用してサービスを定義できます。 組み込みのCamelCaseからsnake_caseへの名前コンバータ

(CamelCaseからsnake_caseへのコンバータ)は、

serializer.name_converter.camel_case_to_snake_caseオプション値を設定することで有効にできます:

PHP:// app/config/config.php$container->loadFromExtension('framework', array(
    // ...
    'serializer' => array(
        'name_converter' => 'serializer.name_converter.camel_case_to_snake_case,
    ),
));
rree
XML:<!-- app/config/config.xml --><framework:config>
    <!-- ... -->
    <framework:serializer name-converter="serializer.name_converter.camel_case_to_snake_case" /></framework:config>

In- Depth Serializer

ApiPlatform は、JSON-LD および Hydra Core Vocabulary# をサポートする API システムを提供します。 ## ハイパーメディア形式。これは、Symfony フレームワークと Serializer コンポーネントに基づいて構築されています。カスタム ノーマライザー、カスタム エンコーダー、カスタム メタデータ、およびキャッシュ システムを提供します。

Symfony Serializer コンポーネントの能力を最大限に活用したい場合は、このバンドルがどのように機能するかを確認する必要があります。

  • カスタム エンコーダの作成方法
  • エンコーダ