Как использовать сериализатор

Сериализация и десериализация в и из объектов и разных форматов (например, JSON или XML) - это очень сложная тема. Symfony имеет свой Компонент Сериализатор, который предоставляет вам некоторые инструменты, которые вы можете использовать для решения ваших задач.

На самом деле, до того как начать, ознакомьтесь с сериализатором, нормализатором и шифровщиками, прочитав Компонент Сериализатор.

Активация сериализатора

Сервис serializer доступен не по умолчанию. Чтобы его включить, активируйте его в вашей конфигурации:

  • YAML
    1
    2
    3
    4
    5
    6
    # app/config/config.yml
    framework:
        # ...
        serializer: { enable_annotations: true }
        # Или, если вы не хотите использовать аннтоации
        #serializer: { enabled: true }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <!-- 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"
        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">
        <framework:config>
            <!-- ... -->
            <framework:serializer enable-annotations="true" />
            <!--
            Или, если вы не хотите использовать аннтоации
            <framework:serializer enabled="true" />
            -->
        </framework:config>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // app/config/config.php
    $container->loadFromExtension('framework', array(
        // ...
        'serializer' => array(
            'enable_annotations' => true,
            // Или, если вы не хотите использовать аннтоации
            //'enabled' => true,
        ),
    ));
    

Использование сервиса serializer

Когда вы включите его, сервис serializer может быть внедрён в любой сервис, где он вам нужен, или же он может использоваться в контроллере:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// src/AppBundle/Controller/DefaultController.php
namespace AppBundle\Controller;

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

class DefaultController extends Controller
{
    public function indexAction(SerializerInterface $serializer)
    {
        // продолжайте читать, чтобы увидеть пример использования
    }
}

Добавление нормализаторов и шифровщиков

После активации, сервис serializer будет доступен в контейнере и будет загружен с четырьмя шифровщиками (JsonEncoder, XmlEncoder, YamlEncoder, и CsvEncoder), а также с нормализатором ObjectNormalizer.

Вы можете загружать нормализаторы и/или шифровщики, тегируя их как serializer.normalizer и serializer.encoder. Также возможно установить приоритет тега по порядку, чтобы определить соответствующий порядок.

Вот пример, как загружать нормализатор GetSetMethodNormalizer:

  • YAML
    1
    2
    3
    4
    5
    6
    # app/config/services.yml
    services:
        get_set_method_normalizer:
            class: Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer
            public: false
            tags: [serializer.normalizer]
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    <!-- app/config/services.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"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service id="get_set_method_normalizer" class="Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer" public="false">
                <tag name="serializer.normalizer" />
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    // app/config/services.php
    use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
    
    $container->register('get_set_method_normalizer', GetSetMethodNormalizer::class)
        ->setPublic(false)
        ->addTag('serializer.normalizer')
    ;
    

Использовать групповых аннотаций сериализации

Активируйте групповые аннотации сериализации со следующей конфигурацией:

  • YAML
    1
    2
    3
    4
    5
    # app/config/config.yml
    framework:
        # ...
        serializer:
            enable_annotations: true
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    <!-- 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"
        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">
    
        <framework:config>
            <!-- ... -->
            <framework:serializer enable-annotations="true" />
        </framework:config>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    // app/config/config.php
    $container->loadFromExtension('framework', array(
        // ...
        'serializer' => array(
            'enable_annotations' => true,
        ),
    ));
    

Далее, добавьте аннотации @Groups в ваш класс, и выберите, какие группы использовать при сериализации:

1
2
3
4
$json = $serializer->serialize(
    $someObject,
    'json', array('groups' => array('group1'))
);

В дополнение к аннотации @Groups, компонент Сериализатор также поддерживает Yaml или XML-файлы. Эти файлы автоматически загружаются, когда они хранятся в следующих локациях:

  • Файл serialization.yml или serialization.xml в каталоге пакета Resources/config/;
  • Все файлы *.yml и *.xml в каталоге пакета Resources/config/serialization/.

Активация кеша метаданных

Метаданные, используемые компонентом Сериализатор, такие как группы, могут быть кешированы, чтобы улучшить производительность приложения. Любой сервис, использующий интерфейс Doctrine\Common\Cache\Cache может быть использован.

Сервис, использующий APCu (и APC для PHP < 5.5), встроенный.

  • YAML
    1
    2
    3
    4
    5
    # app/config/config_prod.yml
    framework:
        # ...
        serializer:
            cache: serializer.mapping.cache.apc
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    <!-- app/config/config_prod.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"
        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">
    
        <framework:config>
            <!-- ... -->
            <framework:serializer cache="serializer.mapping.cache.apc" />
        </framework:config>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    // app/config/config_prod.php
    $container->loadFromExtension('framework', array(
        // ...
        'serializer' => array(
            'cache' => 'serializer.mapping.cache.apc',
        ),
    ));
    

Активация конвертера имён

Использование сервиса конвертера имён может быть определено в конфигурации, используя опцию name_converter.

Встроенный в snake_casе конвертер имён CamelCase может быть активирован, используя значение serializer.name_converter.camel_case_to_snake_case:

  • YAML
    1
    2
    3
    4
    5
    # app/config/config.yml
    framework:
        # ...
        serializer:
            name_converter: 'serializer.name_converter.camel_case_to_snake_case'
    
  • XML
    1
    2
    3
    4
    5
    <!-- app/config/config.xml -->
    <framework:config>
        <!-- ... -->
        <framework:serializer name-converter="serializer.name_converter.camel_case_to_snake_case" />
    </framework:config>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    // app/config/config.php
    $container->loadFromExtension('framework', array(
        // ...
        'serializer' => array(
            'name_converter' => 'serializer.name_converter.camel_case_to_snake_case,
        ),
    ));
    

Углублённые действия с сериализатором

ApiPlatform предоставляет систему API, поддерживающую форматы гипермедиа JSON-LD и Hydra Core Vocabulary. Он встроен в верхушку фреймворка Symfony и ее компонента Сериализатор. Он предоставляет специальные нормализаторы и шифровщик, специальные метаданные и систему кеширования.

Если вы хотите использовать полную мощность компонента Symfony сериализатор, посмотрите на то, как работает этот пакет.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.