직렬 변환기를 사용하는 방법


객체와 다양한 형식(예: JSON 또는 XML) 간의 직렬화 및 역직렬화는 매우 복잡한 주제입니다. Symfony에는 필요에 따라 사용할 수 있는 몇 가지 도구를 제공하는 Serializer 구성 요소가 함께 제공됩니다.

실제로 사용을 시작하기 전에 직렬 변환기, 노멀라이저 및 인코더에 대해 알아보고 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

使用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 }
직렬 변환기 서비스 사용 ¶🎜🎜🎜활성화되면 serializer 서비스는 필요할 때 모든 서비스에 삽입하거나 다음과 같은 컨트롤러에서 사용할 수 있습니다: 🎜
PHP:// app/config/config.php$container->loadFromExtension('framework', array(
    // ...
    'serializer' => array(
        'enable_annotations' => true,
    ),));
🎜노멀라이저 및 인코더 추가
¶🎜🎜🎜🎜이 활성화된 후 직렬 변환기는 컨테이너에서 사용할 수 있으며 두 개의 🎜인코더🎜(JsonEncoder🎜XmlEncoder🎜) 및 🎜ObjectNormalizer Normalizer🎜. 🎜🎜노멀라이저 및/또는 인코더를 serializer.normalizer🎜 및 serializer.encoder🎜 태그. 태그의 우선순위를 설정하여 일치 순서를 결정할 수도 있습니다. 🎜🎜다음 예에서는 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')));
🎜

직렬화된 그룹 주석 사용

다음 구성으로 직렬화된 그룹 주석을 활성화합니다.

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

다음으로 클래스에 @Goups 주석을 추가한 다음 직렬화할 때 사용할 그룹을 선택하세요.

PHP:// app/config/config.php$container->loadFromExtension('framework', array(
    // ...
    'serializer' => array(
        'name_converter' => 'serializer.name_converter.camel_case_to_snake_case,
    ),
));

@Groups 주석 외에도 직렬 변환기 구성 요소는 Yaml 또는 Xml 파일도 지원합니다. 이러한 구성 요소는 다음 위치에 저장되면 자동으로 로드됩니다. @Groups  注释,serializer组件还支持Yaml或Xml文件。这些组件在存放于以下位置时将被自动加载:

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

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

开启Metadata缓存 

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

一个利用了 APCu 的服务被内置在框架中:

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'
rrreee

开启一个命名转换器 

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

  • serialization.ymlResources/config/ 디렉터리에 저장됨 > 또는 serialization.xml;
  • 🎜번들 아래의 Resources/config/serialization/ 디렉토리에 저장된 모든 *.yml *.xml . 🎜
🎜메타데이터 캐싱 활성화 ¶🎜🎜🎜그룹과 같이 Serializer 구성 요소에서 사용하는 메타데이터를 캐시할 수 있습니다. , 프로그램 성능을 향상시킵니다. DoctrineCommonCacheCache 인터페이스를 구현하는 모든 서비스를 사용할 수 있습니다. 🎜🎜APCu🎜를 활용하는 서비스가 프레임워크에 내장되어 있습니다. 🎜rrreeerrreeerrreee🎜이름 지정 변환기 활성화 ¶🎜🎜
🎜2.8 name_converter 옵션은 Symfony 2.8부터 도입되었습니다. 🎜🎜🎜이름 변환기🎜 서비스를 사용하려면 다음에서 name_converter🎜 옵션을 정의합니다. 🎜🎜내장된 CamelCase to snake_case 이름 변환기🎜(camel Case to snake 변환기)는 serializer.name_converter를 설정하여 설정할 수 있습니다. camel_case_to_snake_case 활성화할 옵션 값: 🎜rrreeerrreee🎜rrreee🎜

심층 직렬 변환기

ApiPlatformJSON-LDHydra Core Vocabulary 하이퍼미디어 형식을 지원하는 API 시스템을 제공합니다. 이는 Symfony 프레임워크 및 Serializer 구성 요소를 기반으로 구축되었습니다. 맞춤형 노멀라이저, 맞춤형 인코더, 맞춤형 메타데이터 및 캐싱 시스템을 제공합니다.

Symfony Serializer 구성 요소의 모든 기능을 활용하려면 이 번들이 어떻게 작동하는지 살펴봐야 합니다.