While working on a Laravel project in which repeated HTTP requests are made against several APIs,
I needed a simple and unobtrusive way to cache the multiple API responses for some time —
a time to live (TTL) specific for each API.
The project has a wrapper interface around Guzzle's ClientInterface and each implementation of the former corresponds to one of the APIs the project is talking to. This way I can manage all the requests in a likely fashion, while taking care of the specifics of each API. I can, for example, instantiate the below GuzzleResponseCache with a specific TTL.
The GuzzleResponseCache class is a Guzzle middleware, which means that it handles the intermediary execution of a handler, i.e. a function that modifies the request options and response of the HTTP request performed by Guzzle.
To make it work the GuzzleResponseCache middleware needs to be added to a handler stack, which will be traversed while doing the request. Like so:
$guzzleHandlerStack = \GuzzleHttp\HandlerStack:create(); $cache = \Illuminate\Support\Facades\Cache::store('database'); $guzzleHandlerStack->push(new GuzzleResponseCache($cache, 86400)); $client = new \GuzzleHttp\Client([ handler => $guzzleHandlerStack ]);
This will cache all requests done with
$client for 24 hours in the database — making use
Cache facade (provided you have migrated a cache table with artisan).