guzzle-cache-middleware icon indicating copy to clipboard operation
guzzle-cache-middleware copied to clipboard

Different TTL with GreedyCacheStrategy and RequestMatcher

Open vaclavgreif opened this issue 4 years ago • 2 comments

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 avatar Aug 27 '21 18:08 vaclavgreif

@vaclavgreif did you figure that out? I need that too :/

marcus-at-localhost avatar Feb 06 '22 17:02 marcus-at-localhost

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 ) );
		}

vaclavgreif avatar Feb 06 '22 19:02 vaclavgreif