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

Sha*_*ieh 3 api-platform.com

我想按照此处的doc中的“示例”对数据进行非规范化处理,但始终返回false 的supportNormalization方法AbstractItemNormalizer

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

ili*_*ten 5

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

/**
 * 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);
Run Code Online (Sandbox Code Playgroud)

当此规范化器不支持false您的$data规范化时,此方法返回。而且只有在此方法返回时,true您的normalize方法才会被调用。

该第一参数supportNormalization接收是格式例如jsonjsonapijsonhal等。

因此,如果您的api_platform.yaml配置中包含以下内容:

api_platform:
    formats:
         jsonld:   ['application/ld+json']
Run Code Online (Sandbox Code Playgroud)

但是您在services.yaml注册服务中:

services:
    'App\Serializer\CustomItemNormalizer':
        arguments: [ '@api_platform.serializer.normalizer.item' ]
Run Code Online (Sandbox Code Playgroud)

supportNormalization将始终返回false,因为您的注入/装饰规范化器不支持jsonld,并且您需要:

services:
    'App\Serializer\CustomItemNormalizer':
        arguments: [ 'api_platform.jsonld.normalizer.item' ]
Run Code Online (Sandbox Code Playgroud)

在这里,您可以获得特定格式的可用序列化程序列表(文档中缺少JSONAPI的序列化程序)。

在大多数情况下,我仅使用(de)normalizer来更改/添加一些数据,但是如果您装饰了normalizer,则可以这样做:

services:
    'App\Serializer\CustomItemNormalizer':
        decorates: 'api_platform.jsonld.normalizer.item'
        arguments: [ '@App\Serializer\CustomItemNormalizer.inner' ]
Run Code Online (Sandbox Code Playgroud)

链接到装饰序列化器并添加额外的数据

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