我正在使用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;
}
}
问题在于此属性未在文档中显示,因为它是自定义规范化器添加的。我如何为其添加文档(例如类型,示例等)?
答案 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。