Cara menggunakan Serializer


Siri dan penyahserikatan antara objek dan format yang berbeza (seperti JSON atau XML) ialah topik yang sangat kompleks. Symfony dilengkapi dengan Komponen Serializer, yang memberikan anda beberapa alatan yang boleh anda gunakan mengikut keperluan.

Sebenarnya, sebelum anda mula menggunakannya, biasakan diri dengan serializer, normalizer dan encoder, baca artikel Serializer component.

Aktifkan Serializer

Perkhidmatanserializer tidak tersedia secara lalai. Untuk menghidupkannya, aktifkannya dalam fail konfigurasi anda: 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

使用Serializer服务 

一旦开启, serializer 服务可以在你需要它时注入到任何服务中,或者像下面这样在控制器中使用:

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

添加Normalizers和Encoders 

被开启之后, serializer 在容器中可用,被加载时还带有两个 encodersJsonEncoderXmlEncoder)以及ObjectNormalizer normalizer

你可以加载normalizers和/或encoders,只要给它们打上 serializer.normalizerserializer.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 }
Gunakan perkhidmatan Serializer ¶🎜🎜🎜Setelah didayakan, serializer boleh disuntik ke dalam mana-mana perkhidmatan apabila anda memerlukannya, atau digunakan dalam pengawal seperti ini: 🎜
PHP:// app/config/config.php$container->loadFromExtension('framework', array(
    // ...
    'serializer' => array(
        'enable_annotations' => true,
    ),));
🎜Tambah Penormal dan Pengekod
Selepas ¶🎜🎜🎜🎜 didayakan, serializer tersedia dalam bekas dan dimuatkan dengan dua 🎜encoders🎜 (JsonEncoder🎜 dan XmlEncoder🎜) dan 🎜ObjectNormalizer normalizer🎜. 🎜🎜Anda boleh memuatkan penormal dan/atau pengekod dengan menandakannya dengan serializer.normalizer🎜 dan serializer.encoder🎜 teg. Anda juga boleh menetapkan keutamaan teg untuk menentukan susunan padanan. 🎜🎜Contoh berikut menunjukkan cara memuatkan GetSetMethodNormalizer🎜: 🎜
XML:<!-- app/config/config.xml --><framework:config>
    <!-- ... -->
    <framework:serializer enable-annotations="true" /></framework:config>
YAML:# app/config/config.ymlframework:    # ...
    serializer:
        enable_annotations: true
🎜
$serializer = $this->get('serializer');$json = $serializer->serialize(
    $someObject,
    'json', array('groups' => array('group1')));
🎜

Gunakan anotasi kumpulan bersiri


@Groups  注释,serializer组件还支持Yaml或Xml文件。这些组件在存放于以下位置时将被自动加载:

  • 存放在bundle下面的  Resources/config/  目录中的  serialization.yml  或  serialization.xml

  • 存放在bundle下面的  Resources/config/serialization/  目录中的所有  *.yml  和  *.xml

开启Metadata缓存 

被Serializer组件所使用的metadata,诸如groups,可以被缓存,以提升程序性能。任何实现了 DoctrineCommonCacheCache 接口的服务都可以被使用。

一个利用了 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 to snake_case name converter(驼峰转蛇型转换器)可以通过设置 serializer.name_converter.camel_case_to_snake_case

🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜 🎜Selain anotasi @Groups, komponen serializer juga menyokong fail Yaml atau Xml. Komponen ini akan dimuatkan secara automatik apabila disimpan di lokasi berikut: 🎜🎜
  • 🎜serialization.ymlResources/config/ di bawah bundle > Atau serialization.xml; 🎜
  • 🎜Semua *.yml disimpan dalam direktori Resources/config/serialization/ di bawah bundle dan *.xml . 🎜
🎜Dayakan cache Metadata ¶🎜🎜🎜Metadata yang digunakan oleh komponen Serializer, seperti kumpulan, boleh dicache , untuk meningkatkan prestasi program. Sebarang perkhidmatan yang melaksanakan antara muka DoctrineCommonCacheCache boleh digunakan. 🎜🎜Perkhidmatan yang menggunakan APCu🎜 dibina ke dalam rangka kerja: 🎜
PHP:// app/config/config.php$container->loadFromExtension('framework', array(
    // ...
    'serializer' => array(
        'name_converter' => 'serializer.name_converter.camel_case_to_snake_case,
    ),
));
XML:<!-- app/config/config.xml --><framework:config>
    <!-- ... -->
    <framework:serializer name-converter="serializer.name_converter.camel_case_to_snake_case" /></framework:config>
YAML:# app/config/config.ymlframework:    # ...
    serializer:
        name_converter: 'serializer.name_converter.camel_case_to_snake_case'
🎜Dayakan penukar penamaan
¶🎜🎜
🎜2.8 Pilihan name_converter telah diperkenalkan bermula dengan Symfony 2.8 . 🎜🎜🎜Untuk menggunakan perkhidmatan penukar nama🎜, anda boleh menggunakan pilihan penukar_nama🎜 untuk ditakrifkan. . camel_case_to_snake_case nilai pilihan untuk membolehkan: 🎜rrreeerrreee🎜rrreee🎜

Pensiri Mendalam

ApiPlatform menyediakan sistem API yang menyokong format hipermedia JSON-LD dan Hydra Core Vocabulary. Ia dibina pada rangka kerja Symfony dan komponen Serializer. Ia menyediakan penormal tersuai, pengekod tersuai, metadata tersuai dan sistem caching.

Jika anda ingin memanfaatkan kuasa penuh komponen Symfony Serializer, anda harus melihat cara berkas ini berfungsi.