Normalization Context

Étant donné que nous voulons avoir le contrôle sur ce qu'on veut lire et écrire on va utiliser les groupes de normalization et de denormalization.

En rajoutant normalizationContext={"groups"={"user:read"}}, sur notre entité User nous allons pouvoir choisir les attributs qu'on va renvoyer.

/**
 * @ORM\Entity(repositoryClass=UserRepository::class)
 * @ApiResource(
 *      normalizationContext={"groups"={"user:read"}},
 * )
 */
class User implements UserInterface
normalization

Nous sommes dans la partie encadré en rouge. Nous partons de l'objet et nous allons vers le JSON

Si on fais un GET /users nous n'avons plus d'informations retournés si ce n'est les élèments @id et @type

{
  "@context": "/api/contexts/User",
  "@id": "/api/users",
  "@type": "hydra:Collection",
  "hydra:member": [
    {
      "@id": "/api/users/1",
      "@type": "User"
    }
  ],
  "hydra:totalItems": 1
}

Nous voulons retourner l'id, l'email et les roles. On importe la classe Groups comme suit :

use Symfony\Component\Serializer\Annotation\Groups;

// ...

/**
 * @ORM\Entity(repositoryClass=UserRepository::class)
 * @ApiResource(
 *      normalizationContext={"groups"={"user:read"}},
 * )
 */
class User implements UserInterface
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     * @Groups({"user:read"})
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=180, unique=true)
     * @Groups({"user:read"})
     */
    private $email;

    /**
     * @ORM\Column(type="json")
     * @Groups({"user:read"})
     */
    private $roles = [];

Maintenant en refaisant un GET /users nous avons uniquement les attributs qui appartiennent au groupe user:read

{
  "@context": "/api/contexts/User",
  "@id": "/api/users",
  "@type": "hydra:Collection",
  "hydra:member": [
    {
      "@id": "/api/users/1",
      "@type": "User",
      "id": 1,
      "email": "string",
      "roles": [
        "string",
        "ROLE_USER"
      ]
    }
  ],
  "hydra:totalItems": 1
}

L'email et roles sont équivaut à string car lors du POST /users nous avions laissés les données qui étaient générées par la documentation. Nous allons vérifier les données avant de les enregistrer dans la partie Denormalization

prev next

Commentaires

Connectez-vous pour laisser un commentaire