Kevinrob / guzzle-cache-middleware

A HTTP Cache for Guzzle 6. It's a simple Middleware to be added in the HandlerStack.
MIT License
411 stars 77 forks source link

Different TTL with GreedyCacheStrategy and RequestMatcher #147

Open vaclavgreif opened 3 years ago

vaclavgreif commented 3 years ago

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?

marcus-at-localhost commented 2 years ago

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

vaclavgreif commented 2 years ago

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