Я сделал проект на основе Symfony, который использует внешний API (JSON); я создал независимую клиентскую библиотеку («клиентская библиотека» - часть программного обеспечения, пакет композитора) с собственным набором сущностей (POPO); он интегрируется с платформой с использованием интерфейсов, предоставляемых Symfony (например, путем простого создания пользовательского поставщика ).
Клиент делает http-вызовы «закулисными», что важно для будущих возможностей тестирования. Вы не хотите раскрывать способ общения с источником данных, а также не хотите, чтобы ваши тесты опирались на живые API.
Интерфейс клиентской библиотеки (пример того, как это может выглядеть):
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);
}
Клиентская библиотека внутренне использует Guzzle для связи и компонент Doctrine Cache для кэширования результатов. Отображение между объектами-сущностями и json было сделано мапперами, которые когда-то писали - менялись не очень часто (или вообще не происходили). В этом случае я бы предложил использовать JMS Serializer для автоматического преобразования в JSON и обратно (я предполагаю, что вы используете JSON).
Вам понадобится хороший механизм кэширования и локальное хранилище, например, Redis. Выполнение api-вызовов для каждого запроса приложения убьет ваш сервер и резко замедлит работу вашего приложения. Очень важно понимать, как работают http-кэши. Если ваш API-интерфейс не использует кэширующие заголовки (или использует его неясным образом), будет очень сложно и ресурсоемко отслеживать изменения.
Вам также захочется подумать о том, как должен вести себя клиент в случае разрыва соединения - должен ли клиент использовать заблокированные данные? Было бы неплохо использовать прокси-сервер между вашим приложением и API. В этом случае прокси (например, Varnish) может ускорить ваши запросы, а также обновить заблокированные данные в фоновом режиме, не замедляя работу приложения. Он также будет поддерживать ваш сайт в сети в случае сбоя API. В то же время вы не сможете записывать данные, но ваши пользователи по-прежнему смогут просматривать кэшированные данные.
И если говорить о доктрине, см. « Закон орудия ».