Dans le développement d’une API, nous sommes tous confrontés au même défi : maintenir la cohérence entre la documentation et le code.
Qui n’a jamais perdu des heures à débugger une erreur parce que le champ user_id était devenu userId dans le code, mais pas dans la documentation ? C’est ce qu’on appelle le « drift ». À mesure que le projet évolue, le code change, mais la documentation (OpenAPI, Wiki, Postman) traîne souvent la patte, devenant une source d’erreurs plutôt qu’une aide.
Et si la solution n’était pas de mettre à jour manuellement notre code pour coller à la doc, mais de générer automatiquement notre code à partir de la doc ? C’est ici qu’intervient Jane.
En deux mots : Jane est une suite de librairies PHP dont la mission est de générer du code de qualité à partir de vos spécifications JSON Schema ou OpenAPI.
Si l’on devait résumer son rôle dans une API moderne, Jane agit comme le « traducteur automatique » entre vos contrats d’interface (vos spécifications .yaml ou .json) et votre code PHP. Au lieu d’écrire manuellement vos classes, vos validateurs et vos clients HTTP — une tâche répétitive et sujette à l’erreur humaine — Jane les fabrique pour vous.
Concrètement, Jane analyse votre schéma et produit :
symfony/serializer ;L’atout majeur de Jane n’est pas seulement le gain de temps, c’est la garantie de conformité. Puisque le code est généré directement depuis la source de vérité (le schéma), il est impossible d’avoir une divergence (« drift ») entre ce que votre documentation prétend faire et ce que votre code fait réellement. Si le schéma change, vous régénérez le code, et le tour est joué.
Pour passer de la théorie à la pratique, nous allons construire un cas d’usage classique : un tunnel d’achat e-commerce.
Nous allons simuler la transformation d’un panier en une commande validée. Pour cela, nous découpons la logique en deux micro-services distincts :
Ce scénario nous permettra d’explorer des cas concrets :
Voyons maintenant comment formaliser tout cela dans nos contrats d’API.
Commençons par le service le plus simple : le Panier.
Ici, nous prenons le parti du Design First : avant d’écrire la moindre ligne de PHP, nous allons figer la structure de nos échanges dans un fichier cart.yaml.
Pour ce service, le besoin est basique : nous voulons pouvoir récupérer un panier via son identifiant unique. Voici notre définition en OpenAPI 3.0.3 :
openapi: 3.0.3 info: title: 'Service Panier' version: 1.0.0 paths: /carts/{id}: get: summary: 'Récupérer un panier' parameters: - name: id in: path required: true schema: type: string format: uuid responses: '200': description: 'Le panier trouvé' content: application/json: schema: $ref: '#/components/schemas/Cart' components: schemas: Cart: type: object properties: id: type: string format: uuid items: type: array items: type: string # simplifié pour l'exemple L’utilisation du format uuid sur l...
[Courte citation de 8% de l'article original]