Symfony欧宝娱乐app下载地址 2.7新增功能:序列化器组件改进
警告:这篇文章是关于一个不受支持的Symfony版本。欧宝娱乐app下载地址有些信息可能已经过时了。阅读最新的Symfony文档欧宝娱乐app下载地址.
在Sy欧宝娱乐app下载地址mfony 2.7中,欧宝娱乐app下载地址Symfony Serializer组件已经大大改进了许多新功能。本文将介绍其中最重要的几个。
支持XML和YAML文件中的序列化组
几个月前我们已经谈过了关于通过注释定义序列化组。在使用它们之前,只需使用enable_annotations
配置选项:
1 2 3 4
# app / config / services.yml框架:#……序列化器:{enable_annotations:真正的}
对于那些不喜欢注释的人,现在可以通过XML或YAML文件定义序列化组。Serializer组件将查找serialization.xml
或serialization.yml
位于资源/ config /
你的包目录。此外,它将查找位于资源/ config /序列化/
目录中。
无论使用何种配置格式,这些序列化组生成的元数据都可以使用Doctrine Cache进行缓存。这将大大提高应用程序的性能。例如,如果您的服务器提供对APC或APCu的支持,请使用以下配置启用序列化器缓存:
1 2 3 4
# app / config / config.yml框架:序列化器:缓存:serializer.mapping.cache.apc
新ObjectNormalizer
在Sy欧宝娱乐app下载地址mfony 2.6中有两种归一化器:GetSetMethodNormalizer
而且PropertyNormalizer
.欧宝娱乐app下载地址Symfony 2.7引入了一个新的归一化器ObjectNormalizer
.这是最基本的优势GetSetMethodNormalizer
它支持受保护和私有属性,甚至只定义getter/isser方法的属性:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
类MyObject{公共$喷火=“foo”;公共getBar () {返回“酒吧”;}公共isBaz () {返回真正的;}}使用欧宝娱乐app下载地址\组件\序列化器\标准化者\ObjectNormalizer;$标准化者=新ObjectNormalizer ();$结果=$标准化者->正常化(新MyObject ());/ /结果美元=[“foo”= >“foo”,“酒吧”= >“酒吧”,“记者”= > true)
为了简化设置,这个新的规范化器以及序列化组在FrameworkBundle中默认启用。
能够更改属性名称
的GetSetMethodNormalizer
提供了一个基本的机制来调整属性名到getter/setter方法名的转换:
1 2 3 4 5
/ /……$标准化者=新GetSetMethodNormalizer ();$标准化者->setCamelizedAttributes (数组(“first_name”));$序列化器=新序列化器(数组($标准化者),数组($编码器));
此代码允许first_name
属性正确地转换为getFirstName ()
方法而不是错误getFirst_name ()
方法。
在2.7setCamelizedAttributes ()
方法已弃用,取而代之的是一种新的NameConverter
通用的转换器。第一个可用的名称转换器将camel case转换为snake case,反之亦然:
1 2 3 4 5 6 7
使用欧宝娱乐app下载地址\组件\序列化器\NameConverter\CamelCaseToSnakeCaseNameConverter;使用欧宝娱乐app下载地址\组件\序列化器\标准化者\GetSetMethodNormalizer;/ /……$nameConverter=新CamelCaseToSnakeCaseNameConverter (数组(“first_name”));$标准化者=新GetSetMethodNormalizer (零,$nameConverter);$序列化器=新序列化器(数组($标准化者),数组($编码器));
反序列化为现有对象
每当反序列化信息时,通常都会创建新对象。但是,在Symfony 欧宝娱乐app下载地址2.7中,您可以反序列化到现有对象中。这对于更新通过Doctrine ORM检索到的对象很有用:
1 2 3 4 5 6 7 8 9 10
$existingProduct=$这->getDoctrine ()- >…$产品=$这->标准化者->denormalize (数组(“酒吧”= >“酒吧”),“实体AppBundle \ \ \ \产品”,零,数组(“object_to_populate”= >$existingProduct));// $product和$existingProduct是对同一个对象的引用
DunglasJsonLdApiBundle
为了更好地展示Serializer组件的新特性,Kévin开发了一个名为DunglasJsonLdApiBundle.这个包允许在Serializer组件之上创建带有JSON-LD和Hydra支持的超媒体api。
评论
评论截止。
为了确保评论保持相关性,旧帖子将被关闭。