1414use Psr \Cache \CacheItemPoolInterface ;
1515use Psr \Cache \InvalidArgumentException ;
1616use Psr \Log \LoggerInterface ;
17+ use Symfony \Component \OptionsResolver \Options ;
1718use Symfony \Component \OptionsResolver \OptionsResolver ;
1819
1920class 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