J'ai créé un projet basé sur symfony qui utilise une API externe (JSON); j'ai créé une bibliothèque cliente indépendante ("bibliothèque cliente" - un logiciel, un package de compositeur), avec son propre ensemble d'entités (POPO); il s'intègre au framework à l'aide des interfaces fournies par Symfony (par exemple, en créant simplement un fournisseur d'utilisateurs personnalisé ).
Le client effectue des appels http "en arrière-plan" - ce qui est important pour les futures capacités de test. Vous ne voulez pas exposer la façon dont vous communiquez avec votre source de données et vous ne voulez pas non plus que vos tests s'appuient sur une API en direct.
Interface de bibliothèque client (exemple à quoi elle peut ressembler):
class ApiClient {
/**
* @throws SomeApiException If credentials are invalid
* @return ApiUser
*/
public function authenticate($username, $password);
/**
* @return ApiUser
*/
public function findUserByEmail($email);
/**
* @throws SomeApiException If email is invalid
* @return void
*/
public function changeUserEmail(User $user, $newEmail);
}
La bibliothèque cliente utilise en interne Guzzle pour la communication et le composant Doctrine Cache pour la mise en cache des résultats. Le mappage entre les objets d'entité et json a été fait par des mappeurs, qui une fois écrits - ne changeaient pas très souvent (ou événement du tout). Dans ce cas, je suggère d'utiliser le JMS Serializer pour une transformation automatisée vers et depuis JSON (je suppose que vous utilisez JSON).
Vous aurez besoin d'un bon mécanisme de mise en cache et d'un stockage local, comme Redis. Faire des appels api sur chaque demande d'application va tuer votre serveur et ralentir considérablement votre application. Il est très important de comprendre le fonctionnement des caches http. Si votre API n'utilise pas les en-têtes de mise en cache (ou l'utilise de manière obscure), il sera très difficile et consommateur de ressources de suivre les modifications.
Vous voudrez également réfléchir à la façon dont le client devrait se comporter en cas de rupture de la connexion - le client devrait-il utiliser des données bloquées? Ce serait une bonne idée d'utiliser un serveur proxy entre votre application et l'API. Dans ce cas, le proxy (comme Varnish) pourrait accélérer vos demandes et également actualiser les données bloquées en arrière-plan sans ralentir votre application. Il gardera également votre site Web en ligne en cas de défaillance de l'API. Vous ne pourrez peut-être pas écrire de données entre-temps, mais vos utilisateurs pourront toujours parcourir les données mises en cache.
Et en parlant de Doctrine, voir la " Loi de l'instrument ".