我已经制作了一个使用外部API(JSON)的基于symfony的项目;我所做的是创建一个独立的客户端库(“客户端库”-一种软件,作曲家程序包),并带有自己的一组实体(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序列化器进行JSON的自动转换(假设您使用JSON)。
您将需要一个良好的缓存机制和本地存储,例如Redis。在每个应用程序请求上进行api调用将杀死您的服务器,并严重降低应用程序的速度。了解http缓存的工作方式非常重要。如果您的api不使用缓存标头(或以晦涩的方式使用它),跟踪更改将非常困难且消耗资源。
您还将要考虑如果连接断开,客户端应如何处理-客户端应该使用停顿的数据吗?在您的应用程序和API之间使用一些代理服务器是一个好主意。在这种情况下,代理(如Varnish)可以加快您的请求,并在后台刷新停顿的数据而不会降低您的应用程序的速度。如果API出现故障,它还将使您的网站保持在线状态。在此期间,您可能无法写入数据,但是您的用户仍将能够浏览缓存的数据。
谈到教义,请参见“ 工具法则 ”。