如何创建自定义标准化者
编辑该页面如何创建自定义标准化者
的序列化器组件使用标准化者将任何数据转换成一个数组。该组件提供了几个内置的标准化者但是你可能需要创建自己的标准化者将一个不受支持的数据结构。
创建一个新的标准化者
想象一下你想要添加、修改或删除一些性质在序列化过程中。,你必须创建自己的标准化者。但通常比让Symfony标准化对象,然后钩到自定义规范化数据的标准化。ob娱乐下载为此,利用ObjectNormalizer
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33
/ / src /序列化器/ TopicNormalizer.php名称空间应用程序\序列化器;使用应用程序\实体\主题;使用ob娱乐下载\组件\路由\发电机\UrlGeneratorInterface;使用ob娱乐下载\组件\序列化器\标准化者\NormalizerInterface;使用ob娱乐下载\组件\序列化器\标准化者\ObjectNormalizer;类TopicNormalizer实现了NormalizerInterface{公共函数__construct(私人UrlGeneratorInterface美元路由器、私人ObjectNormalizer美元标准化者,){}公共函数正常化(美元主题、字符串美元格式= null,数组美元上下文= []):数组{美元数据=美元这- >标准化者- >正常化(美元主题,美元格式,美元上下文);/ /在这里添加、编辑或删除一些数据:美元数据(“href”][“自我”]=美元这- >路由器- >生成(“topic_show”,(“id”= >美元主题- >getId ()), UrlGeneratorInterface::ABSOLUTE_URL);返回美元数据;}公共函数supportsNormalization(美元数据、字符串美元格式= null,数组美元上下文= []):bool{返回美元数据运算符主题;}}
在您的应用程序注册它
之前使用这种标准化者在Symfony应用程序必须注册为一个服务ob娱乐下载标记与serializer.normalizer
。如果你使用默认的服务。yaml的配置,这是自动完成!
性能
数字标准化者(或denormalizer)必须用于处理一个对象,序列化器类将调用supportsNormalization ()(或supportsDenormalization ())的所有注册标准化者(或denormalizers)在一个循环中。
这些方法的结果取决于对象序列化,格式和上下文。这就是为什么结果不是缓存默认情况下,会导致显著的性能瓶颈。
然而,大多数标准化者(和denormalizers)始终返回相同的结果当对象的类型和格式是相同的,所以可以缓存的结果。这样做,使这些标准化者(和denormalizers)实现的CacheableSupportsMethodInterface并返回真正的
当hasCacheableSupportsMethod ()被称为。
请注意
所有内置标准化者和denormalizers也包括在的API的平台本机实现这个接口。
6.3
的CacheableSupportsMethodInterface接口是Symfony 6.3以来弃用。ob娱乐下载你应该实现getSupportedTypes ()
方法相反,如以下部分所示。
提高性能的标准化者/ Denormalizers
6.3
的getSupportedTypes ()
方法是在Symfony 6.3中引入的。ob娱乐下载
这两个NormalizerInterface和DenormalizerInterface包含一个新方法getSupportedTypes ()
。这种方法允许标准化者或denormalizers宣布他们可以处理的类型的对象,和是否可缓存。通过这个信息,即使支持* ()
电话不缓存,序列化器可以跳过一吨的方法调用支持* ()
在某些情况下大幅提高性能。
的getSupportedTypes ()
方法应该返回一个数组的键代表所支持的类型,并表明是否值的结果支持* ()
方法调用可以缓存。返回数组的格式如下:
- 特殊的关键
对象
可以用来表明标准化者或denormalizer支持任何类或接口。 - 特殊的关键
*
可以用来表明标准化者或denormalizer可能支持任何类型。 - 另一个数组中的键应该对应于特定类型的标准化者或denormalizer支持。
- 与每个类型相关联的值应该是一个布尔值表示如果的结果
支持* ()
方法调用的类型可以被缓存。的值真正的
意味着结果缓存,假
意味着没有缓存的结果。 - 一个
零
值类型意味着标准化者或denormalizer不支持该类型。
这是一个如何使用的例子getSupportedTypes ()
方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
使用ob娱乐下载\组件\序列化器\标准化者\NormalizerInterface;类MyNormalizer实现了NormalizerInterface{/ /……公共函数getSupportedTypes字符串(?美元格式):数组{返回(“对象”= >零,/ /不支持任何类或接口‘*’= >假,/ /支持其他类型,但结果不是缓存MyCustomClass::类= >真正的,/ /缓存支持MyCustomClass和结果];}}
请注意,支持* ()
不应该认为方法实现getSupportedTypes ()
之前被称为。