自定义规范化器的API平台文档

时间:2019-12-19 10:30:01

标签: symfony api-platform.com

我正在使用API​​平台,我遵循this tutorial添加了依赖于外部服务的自定义序列化字段。 avatar属性需要使用Packages类公开。

<?php

namespace App\Serializer;

use App\Entity\User;
use Symfony\Component\Asset\Packages;
use Symfony\Component\HttpFoundation\UrlHelper;
use Symfony\Component\Serializer\Normalizer\ContextAwareNormalizerInterface;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;

class UserNormalizer implements ContextAwareNormalizerInterface
{
    /**
     * @var Packages
     */
    private $packages;

    /**
     * @var UrlHelper
     */
    private $urlHelper;

    /**
     * @var ObjectNormalizer
     */
    private $normalizer;

    public function __construct(Packages $packages, UrlHelper $urlHelper, ObjectNormalizer $normalizer)
    {
        $this->packages = $packages;
        $this->normalizer = $normalizer;
        $this->urlHelper = $urlHelper;
    }

    public function normalize($user, $format = null, array $context = [])
    {
        /** @var array */
        $data = $this->normalizer->normalize($user, $format, $context);
        $avatar = null;

        if ($user->getAvatarFilename()) {
            $path = $this->packages->getUrl('uploads/avatars/'.$user->getAvatarFilename());
            $avatar = $this->urlHelper->getAbsoluteUrl($path);
        }

        $data['avatar'] = $avatar;

        return $data;
    }

    public function supportsNormalization($data, $format = null, array $context = [])
    {
        return $data instanceof User;
    }
}

问题在于此属性未在文档中显示,因为它是自定义规范化器添加的。我如何为其添加文档(例如类型,示例等)?

3 个答案:

答案 0 :(得分:1)

如果这仍然与您或其他人相关: 您可以使用以下方法将自定义字段添加到openapi模型:https://api-platform.com/docs/core/swagger/#overriding-the-openapi-specification

答案 1 :(得分:0)

您需要将$avatar字段添加到您的实体。

答案 2 :(得分:0)

就像您在评论中建议的那样,您可以向实体添加一个未映射的属性并将其记录在注释中,是的,就像他们说的here!...这是在 SymfonyCast 教程中建议的< /p> <块引用>

请记住这种方法的缺点:我们的文档没有 这个 isMe 字段存在的想法。如果我们刷新此页面并打开 获取单个用户的文档......是的!没有提到isMe。的 当然,你可以在 User 中添加一个公共函数 isMe(),把它放在 user:read group,总是返回false,然后覆盖isMe中的key 您的标准化器具有真正的价值。那会给你的习惯 字段和文档。但是sheesh......那......变得有点hacky。