我想按照文档here中的“示例”对数据进行去归一化,但是supportNormalization
的{{1}}方法始终返回false。
由于该文档对应该做什么以及如何做完全没有帮助,有人可以在这里帮助我吗?我在任何地方都找不到可行的示例。
答案 0 :(得分:4)
首先我们可以从方法的定义中看到:
/**
* Checks whether the given class is supported for normalization by this normalizer.
*
* @param mixed $data Data to normalize
* @param string $format The format being (de-)serialized from or into
*
* @return bool
*/
public function supportsNormalization($data, $format = null);
当此规范化器不支持您的false
规范化时,此方法返回$data
。而且只有当此方法返回true
时,您的normalize
方法才会被调用。
supportNormalization
收到的第一个参数的格式为json
,jsonapi
,jsonhal
等
因此,如果您在api_platform.yaml
配置中有类似以下内容:
api_platform:
formats:
jsonld: ['application/ld+json']
但是您在services.yaml
注册服务中
services:
'App\Serializer\CustomItemNormalizer':
arguments: [ '@api_platform.serializer.normalizer.item' ]
supportNormalization
将始终返回false
,因为您的注入/装饰规范化器不支持jsonld
,并且您需要:
services:
'App\Serializer\CustomItemNormalizer':
arguments: [ 'api_platform.jsonld.normalizer.item' ]
这里有list of available serializers for specific format(文档中缺少JSONAPI的序列化器)的列表。
我使用(去)规范化器的大多数情况是要更改/添加一些数据,但是如果装饰规范化器,这是可能的:
services:
'App\Serializer\CustomItemNormalizer':
decorates: 'api_platform.jsonld.normalizer.item'
arguments: [ '@App\Serializer\CustomItemNormalizer.inner' ]
链接到decorating a serializer and adding extra data。
因此,最后您需要注入正确的规范化器并进行装饰。