Documentation API
Consultez la documentation d'API pour connecter P.R.I.S.M.E à vos systèmes.
La robustesse d'un SaaS moderne repose à 90% sur la qualité de l'interface qui orchestre le flux d'échange asynchrone entre le client SPA (React) et le socle de base de données (MySQL). P.R.I.S.M.E expose une API REST (/api/…) servie par Symfony, sur le même domaine que l'application.
L'Interceptor Axios (Ingénierie Frontend)
D'un point de vue architectural côté ReactJS, nous avons remplacé l'implémentation standard Fetch() par un client HTTP Axios de qualité industrielle. Pourquoi ? L'objectif de P.R.I.S.M.E étant hautement multitenant, un ingénieur frontend n'a ni le temps ni l'envie d'inclure manuellement le jeton d'entreprise dans les paramètres GET de centaines d'appels distincts dans le code pour chercher un Devis ou une Ligne Comptable. Pour cela, une logique native nommée 'Axios Interceptors' a été configurée dans src/lib/api.js. À chaque fois qu'un appel asynchrone sort du client React, le navigateur le met en pause, attrape le current_company_id présent dans le Device (LocalStorage) et l'injecte dans la chaine de requête tout en configurant la propriété withCredentials : true pour que le système transfère les Cookies PHP natifs à notre script serveur pour les valider.
Des routes REST côté serveur
Chaque ressource (devis, factures, acomptes, clients…) a son URL sous /api/, reçue par le contrôleur frontal Symfony qui vérifie la session, le rôle, le forfait et l'abonnement avant toute opération. Toute option CORS est strictement restreinte par des header Access-Control-Allow-Origin limités au domaine de production déclaré. La méthode HTTP porte l'intention (GET = lecture, POST = création ou action, PUT = modification, DELETE = suppression) et les erreurs sortent toujours au même format JSON avec le bon code HTTP (401, 403, 404, 405…).
Les accès à la base passent par Doctrine et des requêtes préparées, $connection->fetchAllAssociative($sql, $params), qui écartent les injections SQL.
// Une ressource = une URL ; la méthode HTTP dit ce qu'on en fait.
GET /api/devis?year=2026 // liste des devis de l'année
GET /api/devis/254 // un devis, ses lignes et sa facture
POST /api/devis // création (lignes comprises)
PUT /api/devis/254 // modification
DELETE /api/devis/254 // mise à la corbeille
POST /api/devis/254/restauration // sortie de la corbeille
POST /api/factures/31/paiement // facture marquée payée
// Côté React, un seul client (src/lib/api.js) :
const { id } = await api.post('api/devis', {
titre: "Chantier Réhabilitation Bordeaux",
lignes: [{ libelle: 42, quantite: 12, prix_unite_ht: 15.5, marge: 30 }],
});