guzzle-cache-middleware
guzzle-cache-middleware copied to clipboard
Different TTL with GreedyCacheStrategy and RequestMatcher
I'm defining a DelegatingCacheStrategy, and I'm using a simple config to define which endpoint should be cached:
$cache_config = [
'get' => [
'agreements'
],
];
$cache = new Cache( new FilesystemAdapter('testCache',0, __DIR__), $cache_config );
$strategy = new DelegatingCacheStrategy( $defaultStrategy = new NullCacheStrategy() );
$strategy->registerRequestMatcher( new CacheRequestMatcher($this->cache->getConfig()), new GreedyCacheStrategy( new Psr6CacheStorage( $this->cache->getCacheItemPool() ), 1600 ) );
$stack->push( new CacheMiddleware( $strategy ) );
and the matcher method looks like this:
/**
* @inheritDoc
*/
public function matches( RequestInterface $request ) {
$request_type = strtolower( $request->getMethod() );
if (empty($this->config[$request_type])) {
return false;
}
foreach ( $this->config[$request_type] as $endpoint ) {
if (strpos($request->getUri()->getPath(), $endpoint) !== false) {
return true;
}
}
return false;
}
This works great, but I'd need to be able to define different TTLs for different endpoints. Is there a way to set that somehow?
@vaclavgreif did you figure that out? I need that too :/
Hi Marcus, in the end I did something like this:
$cache_rules = [
new Rule( Rule::REQUEST_TYPE_GET, 'agreements', 400 ),
];
$cache = new Cache(
new FilesystemAdapter( 'testCache', 0, __DIR__ ),
$cache_rules
);
$careCloud = new MySdk( $config, $cache );
and in the MySDK:
if ( $this->cache ) {
$strategy = new DelegatingCacheStrategy( $defaultStrategy = new NullCacheStrategy() );
foreach ( $this->cache->getRules() as $item ) {
$strategy->registerRequestMatcher(
new CacheRequestMatcher( $item ),
new GreedyCacheStrategy(
new Psr6CacheStorage( $this->cache->getCacheItemPool() ),
$item->getTtl() )
);
}
$stack->push( new CacheMiddleware( $strategy ) );
}