シリアライザーの使い方
オブジェクトと異なる形式 (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 インターフェースを実装する任意のサービスを使用できます。
##2.8
name_converter オプションは、Symfony 2.8 から導入されました。
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 コンポーネントの能力を最大限に活用したい場合は、このバンドルがどのように機能するかを確認する必要があります。