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

Use custom normalizer and normalization support

我想按照文档 here 中的 "example" 规范化我的数据,但是 AbstractItemNormalizersupportNormalization 方法总是 returns 错误。

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

首先从方法的定义我们可以看出:

/**
 * 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);

当此规范器不支持您的 $data 规范化时,此方法 returns false。并且只有当这个方法 returns 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 将始终 return false,因为您的 inject/decorate 标准化器不支持 jsonld,并且您需要:

services:
    'App\Serializer\CustomItemNormalizer':
        arguments: [ 'api_platform.jsonld.normalizer.item' ]

这里有一个 list of available serializers for specific format 的列表(文档中缺少 JSONAPI 的序列化程序)。

在大多数情况下,我只对 change/add 一些数据使用(去)规范化器,但如果你修饰规范化器,这是可能的:

services:
    'App\Serializer\CustomItemNormalizer':
        decorates: 'api_platform.jsonld.normalizer.item'
        arguments: [ '@App\Serializer\CustomItemNormalizer.inner' ]

Link 到 decorating a serializer and adding extra data.

所以最后你需要注入正确的标准化器并装饰它。