0
votes

Documentation de la plate-forme API pour la normalisation personnalisée

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;
    }
}


0 commentaires

3 Réponses :


0
votes

Vous devez ajouter $ avatar sur votre entité.


1 commentaires

Le problème est que j'ai déjà un avatarfileName , dois-je ajouter un "factice" avatar propriété non mappée avec la doctrine? Cela semble un peu hacky, n'est-ce pas?



1
votes

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


1 commentaires

Merci, malheureusement, j'ai abandonné la plate-forme API et je suis retourné à Fosrestresbundle.



0
votes

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

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.


0 commentaires