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
在容器中可用,被加载时还带有两个 encoders(JsonEncoder
和 XmlEncoder
)以及ObjectNormalizer normalizer。
你可以加载normalizers和/或encoders,只要给它们打上 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 }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
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.yml
Resources/config/ sous le bundle > Ouserialization.xml
;- 🎜Tous les
*.yml stockés dans le répertoire
Resources/config/serialization/
sous le bundle code> et*.xml
. 🎜
DoctrineCommonCacheCache
peut être utilisé. 🎜🎜Un service utilisant APCu🎜 est intégré au framework : 🎜rrreeerrreeerrreee🎜Activer un convertisseur de noms ¶🎜🎜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 code> 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.