This package allows to store an entire response in cache, adding some useful headers commonly used by third party services like varnish, CloudFlare and so.
Using Composer
composer require square1/response-cache
Once installed, please add the cache-middleware to your kernel.php
file:
protected $routeMiddleware = [
//...
'cache' = \Square1\ResponseCache\Middleware\ResponseCacheMiddleware::class,
//...
];
Add the middleware to the route or group of routes you want to cache:
Route::get('/my-route', 'MyController')->middleware('cache');
The cache profiles will give you full control on how to add or remove any particular route from the cache
<?php
namespace App\CacheProfiles;
use Square1\ResponseCache\Profiles\BaseCacheProfile
class ArticleCacheProfile extends BaseCacheProfile {
/** time in seconds **/
protected $ttl = 3600;
/** Tags to 'flush' when removed **/
protected $flushCacheTags = [];
/** Current profile identifier tags **/
protected $cacheTags = [];
/** Cache any response with the following statuses **/
protected $cacheStatus = [200];
/**
* Decide wether the current request should be cached or not
* @param Illuminate\Http\Request $request
* return boolean
**/
public function shouldBeCached(Request $request)
{
return $request->isMethod('GET');
}
}
By creating a new instance of the cache-profile you can get and remove any request from the cache:
$profile = new ArticleCacheProfile($request);
$responseCache = resolve(ResponseCache::class);
$responseCache->withTags($profile->getTags())->flush();
You can use the $flushCacheTags
attribute in your cache-profile to reference other profile tags, like so:
class ArticleCacheProfile {
protected $cacheTags = ['article'];
protected $flushCacheTags = ['homepage', 'category-page'];
}
class HomeCacheProfile {
protected $cacheTags = ['homepage'];
}
class CategoriesCacheProfile {
protected $cacheTags = ['category-page'];
}
Using that crossed reference, now you could for instance, remove the "homepage" and "category-page" from the cache while removing any "article" from the cache, like so:
$profile = new ArticleCacheProfile($request);
$cacheResponse = resolve(CacheResponse::class);
/** Clear the cache for a given URL */
$cacheResponse->withTags($profile->getTags())->forget(url('/some-article-url'));
// Flush the cache for ALL the referenced routes ('homepage' and 'category-page')
Cache::tags($profile->getFlushCacheTags())->flush();
- Package auto-discovery
- open a new 'PURGE' route