使用自定义规范化和规范化支持

时间:2019-01-18 14:15:59

标签: api-platform.com

我想按照文档here中的“示例”对数据进行去归一化,但是supportNormalization的{​​{1}}方法始终返回false。

由于该文档对应该做什么以及如何做完全没有帮助,有人可以在这里帮助我吗?我在任何地方都找不到可行的示例。

1 个答案:

答案 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收到的第一个参数的格式为jsonjsonapijsonhal

因此,如果您在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

因此,最后您需要注入正确的规范化器并进行装饰。