Skip to content

Commit 896bab1

Browse files
author
Valentin Clavreul
committed
Added a TTL option for the cached transformer
1 parent 478f9d8 commit 896bab1

File tree

2 files changed

+38
-4
lines changed

2 files changed

+38
-4
lines changed

Documentation/changelog/CHANGELOG-3.2.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@ _Nothing yet_
1616

1717
_Nothing yet_
1818

19+
v3.2.4
20+
------
21+
22+
### Features
23+
24+
* Added a `ttl` option in the `cached` transformer
25+
1926
v3.2.3
2027
------
2128

Transformer/CachedTransformer.php

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Psr\Cache\CacheItemPoolInterface;
1515
use Psr\Cache\InvalidArgumentException;
1616
use Psr\Log\LoggerInterface;
17+
use Symfony\Component\OptionsResolver\Options;
1718
use Symfony\Component\OptionsResolver\OptionsResolver;
1819

1920
class CachedTransformer implements ConfigurableTransformerInterface
@@ -36,8 +37,11 @@ class CachedTransformer implements ConfigurableTransformerInterface
3637
* @param CacheItemPoolInterface $cache
3738
* @param LoggerInterface $logger
3839
*/
39-
public function __construct(TransformerRegistry $transformerRegistry, CacheItemPoolInterface $cache, LoggerInterface $logger)
40-
{
40+
public function __construct(
41+
TransformerRegistry $transformerRegistry,
42+
CacheItemPoolInterface $cache,
43+
LoggerInterface $logger
44+
) {
4145
$this->transformerRegistry = $transformerRegistry;
4246
$this->cache = $cache;
4347
$this->logger = $logger;
@@ -47,6 +51,24 @@ public function configureOptions(OptionsResolver $resolver)
4751
{
4852
$resolver->setRequired('cache_key');
4953
$resolver->setAllowedTypes('cache_key', 'string');
54+
55+
$resolver->setDefault('ttl', null);
56+
$resolver->setAllowedTypes('ttl', ['null', 'string', \DateTimeInterface::class]);
57+
$resolver->setNormalizer(
58+
'ttl',
59+
function (Options $options, $value) {
60+
/**
61+
* Best use is a relative date string like "+1 hour"
62+
* @see https://www.php.net/manual/en/datetime.formats.relative.php
63+
*/
64+
if (is_string($value)) {
65+
$value = new \DateTime($value);
66+
}
67+
68+
return $value;
69+
}
70+
);
71+
5072
$this->configureTransformersOptions($resolver);
5173
$this->configureTransformersOptions($resolver, 'key_transformers');
5274
}
@@ -58,11 +80,13 @@ public function transform($value, array $options = [])
5880
try {
5981
$cacheItem = $this->cache->getItem($cacheKey);
6082
if ($cacheItem->isHit()) {
61-
6283
return $cacheItem->get();
6384
} else {
6485
$newValue = $this->applyTransformers($options['transformers'], $value);
6586
$cacheItem->set($newValue);
87+
if ($options['ttl']) {
88+
$cacheItem->expiresAt($options['ttl']);
89+
}
6690
$success = $this->cache->saveDeferred($cacheItem);
6791

6892
if (!$success) {
@@ -72,7 +96,10 @@ public function transform($value, array $options = [])
7296
return $newValue;
7397
}
7498
} catch (InvalidArgumentException $exception) {
75-
$this->logger->warning('Cannot get cache item', ['cache_key' => $cacheKey, 'message' => $exception->getMessage()]);
99+
$this->logger->warning(
100+
'Cannot get cache item',
101+
['cache_key' => $cacheKey, 'message' => $exception->getMessage()]
102+
);
76103
}
77104
}
78105

0 commit comments

Comments
 (0)