J'utilise la plate-forme API et j'ai suivi Ce tutoriel pour ajouter une coutume champ sérialisé qui repose sur un service externe. La propriété code> avatar doit être exposée à l'aide des packages code> code> classe.
<?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 Réponses :
Vous devez ajouter $ avatar code> sur votre entité. p>
Le problème est que j'ai déjà un avatarfileName code>, dois-je ajouter un "factice" avatar code> propriété non mappée avec la doctrine? Cela semble un peu hacky, n'est-ce pas?
Si cela est toujours pertinent pour vous ou quelqu'un d'autre: Vous pouvez ajouter un champ personnalisé au modèle Openapi avec ceci: https://api-platform.com/docs/core/swagger/#overriding-the-openapi-specification P>
Merci, malheureusement, j'ai abandonné la plate-forme API et je suis retourné à Fosrestresbundle.
Comme vous le suggérez dans les commentaires, vous pouvez ajouter une propriété non mappée à votre entité et le documenter dans les annotations, et oui c'est hacky comme ils ont dit ici ! ... Il est suggéré dans les tutoriels symfonycast p>
Rappelez-vous simplement l'inconvénient de cette approche: notre documentation n'a pas de idée que ce champ isme existe. Si nous actualisons cette page et ouvre la Docs pour récupérer un seul utilisateur ... Yep! Il n'y a aucune mention d'isme. De Bien sûr, vous pouvez ajouter une fonction publique isme () dans l'utilisateur, mettez-le dans le Utilisateur: lire le groupe, retournez toujours false, puis remplace la clé ISME dans votre normaliste avec la valeur réelle. Cela vous donnerait la coutume champ et les docs. Mais sheesh ... c'est ... d'obtenir un hacky. P> blockQuote>