Ho realizzato un progetto basato su symfony che utilizza un'API esterna (JSON); quello che ho fatto è stato creare una libreria client indipendente ("libreria client" - un pezzo di software, pacchetto compositore), con il proprio set di entità (POPO); si integra con il framework utilizzando le interfacce fornite da Symfony (ad esempio, semplicemente creando un provider utente personalizzato ).
Il client rende le chiamate http "dietro le quinte", il che è importante per le future capacità di test. Non vuoi esporre il modo in cui comunichi con l'origine dati e non vuoi che i tuoi test facciano affidamento su API live.
Interfaccia della libreria client (esempio come potrebbe apparire):
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 libreria client utilizza Guzzle per la comunicazione e il componente Doctrine Cache per la memorizzazione nella cache dei risultati. La mappatura tra oggetti entità e json è stata fatta da mappatori, che una volta scritti non cambiavano molto spesso (o evento). In questo caso, suggerirei di utilizzare il serializzatore JMS per una trasformazione automatizzata da e verso JSON (suppongo che tu usi JSON).
Avrai bisogno di un buon meccanismo di memorizzazione nella cache e di archiviazione locale, come Redis. Effettuare chiamate API per ogni richiesta di app interromperà il server e rallenterà drasticamente l'applicazione. È molto importante capire come funzionano le cache http. Se l'API non utilizza le intestazioni di memorizzazione nella cache (o la utilizza in modo oscuro), sarà molto difficile e dispendioso in termini di risorse tenere traccia delle modifiche.
Dovresti anche pensare a come dovrebbe comportarsi il client in caso di interruzione della connessione: il client dovrebbe utilizzare i dati bloccati? Sarebbe una buona idea usare un server proxy tra la tua app e l'API. In questo caso il proxy (come Varnish) potrebbe velocizzare le tue richieste e anche aggiornare i dati bloccati in background senza rallentare l'app. Manterrà anche il tuo sito Web online in caso di errore dell'API. Nel frattempo potresti non essere in grado di scrivere dati, ma i tuoi utenti saranno comunque in grado di sfogliare i dati memorizzati nella cache.
E parlando di Dottrina, vedi la " Legge dello strumento ".