3 - Exposer des données avec ApiPlatform

La doc oficielle

Start up

Comme souvent, tout commence par l'installation d'un package:

ApiPlatform à l'énorme avantage d'être 100% intégré à l'écosystème Symfony (et donc Doctrine).

Par défaut, pour transformer une Entity en ressource Api, il vous suffit d'une ligne de code à ajouté sur votre entité.

Exemple pour notre entité User, qui ressemble actuellement à:

Il suffit de lui ajouter une annotation pour la transformer en une API complète:

Vous venez de dire à ApiPlatform que votre User est une API.

En interne, ApiPlatform fait plusieurs choses:

  1. Il "crée" tous les controllers pour la gestion de vos Users (création/édition/suppression)

  2. Il défini une documentation propre (visible sur /api/docs)

Exemple de la doc

Vous pouvez ainsi appeler /api/users et avoir la liste de tous vos utilisateurs:

On peut voir ici un premier soucis: le mot de passe ressort dans notre API. Même s'il est crypté, on ne devrait pas le renvoyer.

Pour cela on peut utiliser deux méthode lié au Serializer Symfonyarrow-up-right:

  • Les groups de sérialization

  • L'attribut de serialization #[Ignore]

Exemple avec l'attribut:

Le password sera désormais ignoré dans votre API (que ce soit en lecture ou en écriture)

Il est possible d'avoir plus de granularité via l'attribut ApiProperty:

Par exemple, dans notre cas, on précise que la propriété email est uniquement readable.

Cette attribut ne gère pas que ça, n'hésitez pas à l'explorer plus en profondeur !

Limiter les opérations exposés

Par défaut, l'attribut #[ApiResource] expose toutes les requête REST existantes:

  • Deux en méthode GET:

    • Une pour récupérer une collection (/api/users)

    • Une pour récupérer un objet en particulier: (/api/users/{uuid})

  • Une méthode POST: Pour créer un objet (/api/users)

  • Une méthode PATCH: Pour modifier partiellement un objet (/api/users/{uuid})

  • Une méthode PUT: Pour modifier complètement un objet (/api/users/{uuid})

  • Une méthode DELETE: Pour supprimer complètement un objet (/api/users/{uuid})

C'est changeable on appliquant seulement les requêtes que l'on souhaite:

Last updated