如何创建自定义标准化者
编辑该页面如何创建自定义标准化者
的序列化器组件使用标准化者将任何数据转换成一个数组。该组件提供了几个内置的标准化者但是你可能需要创建自己的标准化者将一个不受支持的数据结构。
创建一个新的标准化者
想象一下你想要添加、修改或删除一些性质在序列化过程中。,你必须创建自己的标准化者。但通常比让Symfony标准化对象,然后钩到自定义规范化数据的标准化。ob娱乐下载为此,利用NormalizerAwareInterface
和NormalizerAwareTrait
。这将给你访问标准化者美元
财产负责大部分的正常化过程:
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 34 35 36 37 38 39 40
/ / src /序列化器/ TopicNormalizer.php名称空间应用程序\序列化器;使用应用程序\实体\主题;使用ob娱乐下载\组件\路由\发电机\UrlGeneratorInterface;使用ob娱乐下载\组件\序列化器\标准化者\NormalizerInterface;类TopicNormalizer实现了NormalizerInterface,NormalizerAwareInterface{使用NormalizerAwareTrait;公共函数__construct(私人UrlGeneratorInterface美元路由器,){}公共函数正常化(美元主题、字符串美元格式= null,数组美元上下文= []):数组{美元数据=美元这- >标准化者- >正常化(美元主题,美元格式,美元上下文);/ /在这里添加、编辑或删除一些数据:美元数据(“href”][“自我”]=美元这- >路由器- >生成(“topic_show”,(“id”= >美元主题- >getId ()), UrlGeneratorInterface::ABSOLUTE_URL);返回美元数据;}公共函数supportsNormalization(美元数据、字符串美元格式= null,数组美元上下文= []):bool{返回美元数据运算符主题;}公共函数getSupportedTypes字符串(?美元格式):数组{返回(主题::类= >真正的,);}}
6.4
注入一个ObjectNormalizer
在您的自定义标准化者是Symfony 6.4以来弃用。ob娱乐下载实现NormalizerAwareInterface并使用NormalizerAwareTrait相反注入标准化者美元
财产。
在您的应用程序注册它
之前使用这种标准化者在Symfony应用程序必须注册为一个服务ob娱乐下载标记与serializer.normalizer
。如果你使用默认的服务。yaml的配置,这是自动完成!
标准化者/ Denormalizers的性能
数字标准化者(或denormalizer)必须用于处理一个对象,序列化器类将调用supportsNormalization ()(或supportsDenormalization ())的所有注册标准化者(或denormalizers)在一个循环中。
此外,这两个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 ()
之前被称为。