Comment utiliser le sérialiseur


La sérialisation et la désérialisation entre un objet et différents formats (tels que JSON ou XML) est un sujet très complexe. Symfony est livré avec un ComposantSerializer, qui vous fournit des outils que vous pouvez utiliser selon vos besoins.

En fait, avant de commencer à l'utiliser, familiarisez-vous avec le sérialiseur, le normaliseur et l'encodeur, lisez l'article Serializer Component.

Activer le sérialiseur

Le service sérialiseur n'est pas disponible par défaut. Pour l'activer, activez-le dans votre fichier de configuration : 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 }
Utilisez le service Serializer ¶🎜🎜🎜Une fois activé, sérialiseur peut être injecté dans n'importe quel service lorsque vous en avez besoin, ou utilisé dans un contrôleur comme celui-ci : 🎜
PHP:// app/config/config.php$container->loadFromExtension('framework', array(
    // ...
    'serializer' => array(
        'enable_annotations' => true,
    ),));
🎜Ajouter des normaliseurs et des encodeurs
Une fois ¶🎜🎜🎜🎜 activé, le sérialiseur est disponible dans le conteneur et est chargé avec deux 🎜encodeurs🎜 (JsonEncoder🎜 et XmlEncoder🎜) et 🎜ObjectNormalizer normaliseur🎜. 🎜🎜Vous pouvez charger des normaliseurs et/ou des encodeurs en les marquant avec serializer.normalizer🎜 et serializer.encoder🎜. Vous pouvez également définir la priorité des balises pour déterminer l'ordre de correspondance. 🎜🎜L'exemple suivant montre comment charger 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')));
🎜

Utilisez les annotations de groupe sérialisées

Activez les annotations de groupe sérialisées avec la configuration suivante :

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

Ensuite, ajoutez Annotations @Goups à votre classe, puis lors de la sérialisation, choisissez le groupe à utiliser

r : rreee

En plus de l'annotation @Groups, le composant sérialiseur prend également en charge les fichiers Yaml ou Xml. Ces composants seront automatiquement chargés lorsqu'ils seront stockés à l'emplacement suivant : @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.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'

开启一个命名转换器 

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/ sous le bundle > Ou serialization.xml ;
  • 🎜Tous les *.yml stockés dans le répertoire Resources/config/serialization/ sous le bundle et *.xml . 🎜
🎜Activer la mise en cache des métadonnées ¶🎜🎜🎜Les métadonnées utilisées par le composant Serializer, telles que les groupes, peuvent être mises en cache , pour améliorer les performances du programme. Tout service qui implémente l'interface DoctrineCommonCacheCache peut être utilisé. 🎜🎜Un service utilisant APCu🎜 est intégré au framework : 🎜rrreeerrreeerrreee🎜Activer un convertisseur de noms ¶🎜🎜
🎜2.8 name_converter a été introduite à partir de Symfony 2.8. 🎜🎜🎜Pour utiliser le service name converter🎜, vous pouvez utiliser name_converter🎜 option à définir. 🎜🎜Le Convertisseur de nom CamelCase en Snake_case🎜 (convertisseur de boîtier Camel en Serpent) peut être défini en définissant serializer.name_converter. camel_case_to_snake_case valeur de l'option à activer : 🎜rrreeerrreee🎜rrreee🎜

Sérialiseur approfondi

ApiPlatform fournit un système API qui prend en charge les formats hypermédia JSON-LD et Hydra Core Vocabulary. Il est construit sur le framework Symfony et le composant Serializer. Il fournit des normalisateurs personnalisés, un encodeur personnalisé, des métadonnées personnalisées et un système de mise en cache.

Si vous souhaitez profiter de toute la puissance du composant Symfony Serializer, vous devriez jeter un œil au fonctionnement de ce bundle.