Skip to content

Commit 09e2c9a

Browse files
author
Valentin Clavreul
committed
Added the possibility to cache transformer data & a "multi-replace" transformer
1 parent ff0e32c commit 09e2c9a

File tree

4 files changed

+148
-2
lines changed

4 files changed

+148
-2
lines changed

Documentation/changelog/CHANGELOG-3.2.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,17 @@ v3.2-dev
66

77
### Features
88

9-
_Nothing yet_
9+
* Added `multi_replace` transformer
10+
* Added `cached` transformer
1011

1112
### Fixes
1213

1314
* Fixed return value of list and help commands (mandatory for Symfony 5)
1415

1516
### BC breaks
1617

17-
_Nothing yet_
18+
* Added `psr/cache` as a dependency, but it shouldn't break anything
19+
* Added `ext-intl` as a dependency, since required by the `slugify` transformer
1820

1921
v3.2.2
2022
------

Transformer/CachedTransformer.php

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
<?php declare(strict_types=1);
2+
/*
3+
* This file is part of the CleverAge/ProcessBundle package.
4+
*
5+
* Copyright (C) 2017-2021 Clever-Age
6+
*
7+
* For the full copyright and license information, please view the LICENSE
8+
* file that was distributed with this source code.
9+
*/
10+
11+
namespace CleverAge\ProcessBundle\Transformer;
12+
13+
use CleverAge\ProcessBundle\Registry\TransformerRegistry;
14+
use Psr\Cache\CacheItemPoolInterface;
15+
use Psr\Cache\InvalidArgumentException;
16+
use Psr\Log\LoggerInterface;
17+
use Symfony\Component\OptionsResolver\OptionsResolver;
18+
19+
class CachedTransformer implements ConfigurableTransformerInterface
20+
{
21+
22+
const CACHE_SEPARATOR = '|';
23+
24+
use TransformerTrait;
25+
26+
/** @var CacheItemPoolInterface */
27+
protected $cache;
28+
29+
/** @var LoggerInterface */
30+
protected $logger;
31+
32+
/**
33+
* CachedTransformer constructor.
34+
*
35+
* @param TransformerRegistry $transformerRegistry
36+
* @param CacheItemPoolInterface $cache
37+
* @param LoggerInterface $logger
38+
*/
39+
public function __construct(TransformerRegistry $transformerRegistry, CacheItemPoolInterface $cache, LoggerInterface $logger)
40+
{
41+
$this->transformerRegistry = $transformerRegistry;
42+
$this->cache = $cache;
43+
$this->logger = $logger;
44+
}
45+
46+
public function configureOptions(OptionsResolver $resolver)
47+
{
48+
$resolver->setRequired('cache_key');
49+
$resolver->setAllowedTypes('cache_key', 'string');
50+
$this->configureTransformersOptions($resolver);
51+
$this->configureTransformersOptions($resolver, 'key_transformers');
52+
}
53+
54+
public function transform($value, array $options = [])
55+
{
56+
$cacheKey = $this->generateCacheKey($options['cache_key'], $value, $options);
57+
if ($cacheKey && $this->cache instanceof CacheItemPoolInterface) {
58+
try {
59+
$cacheItem = $this->cache->getItem($cacheKey);
60+
if ($cacheItem->isHit()) {
61+
62+
return $cacheItem->get();
63+
} else {
64+
$newValue = $this->applyTransformers($options['transformers'], $value);
65+
$cacheItem->set($newValue);
66+
$success = $this->cache->saveDeferred($cacheItem);
67+
68+
if (!$success) {
69+
$this->logger->warning('Cannot save cache item', ['cache_key' => $cacheKey]);
70+
}
71+
72+
return $newValue;
73+
}
74+
} catch (InvalidArgumentException $exception) {
75+
$this->logger->warning('Cannot get cache item', ['cache_key' => $cacheKey, 'message' => $exception->getMessage()]);
76+
}
77+
}
78+
79+
return $this->applyTransformers($options['transformers'], $value);
80+
}
81+
82+
public function getCode()
83+
{
84+
return 'cached';
85+
}
86+
87+
protected function generateCacheKey($cacheKeyRoot, $value, $options)
88+
{
89+
$value = $this->applyTransformers($options['key_transformers'], $value);
90+
91+
if (!\is_string($value)) {
92+
return false;
93+
}
94+
95+
return \implode(self::CACHE_SEPARATOR, [$cacheKeyRoot, \rawurlencode($value)]);
96+
}
97+
98+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php declare(strict_types=1);
2+
/*
3+
* This file is part of the CleverAge/ProcessBundle package.
4+
*
5+
* Copyright (C) 2017-2021 Clever-Age
6+
*
7+
* For the full copyright and license information, please view the LICENSE
8+
* file that was distributed with this source code.
9+
*/
10+
11+
namespace CleverAge\ProcessBundle\Transformer;
12+
13+
use Symfony\Component\OptionsResolver\OptionsResolver;
14+
15+
/**
16+
* Quickly replace a list of values in a string
17+
*
18+
* ##### Options
19+
*
20+
* * `replace_mapping` (`array`, _required_): a list of _pattern_ => _replacement_ to apply on input strings
21+
*/
22+
class MultiReplaceTransformer implements ConfigurableTransformerInterface
23+
{
24+
public function transform($value, array $options = [])
25+
{
26+
foreach($options['replace_mapping'] as $pattern => $replacement) {
27+
$value = str_replace($pattern, $replacement, $value);
28+
}
29+
30+
return $value;
31+
}
32+
33+
public function configureOptions(OptionsResolver $resolver)
34+
{
35+
$resolver->setRequired('replace_mapping');
36+
$resolver->setAllowedTypes('replace_mapping', 'array');
37+
}
38+
39+
public function getCode()
40+
{
41+
return 'multi_replace';
42+
}
43+
44+
}

composer.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@
4040
"php": ">=7.2",
4141
"ext-json": "*",
4242
"ext-dom": "*",
43+
"ext-intl": "*",
4344
"symfony/event-dispatcher-contracts": "~1.0|~2.0",
4445
"psr/event-dispatcher": "1.0.0",
46+
"psr/cache": "^1.0.0",
4547
"symfony/config": "~3.0|~4.0|~5.0",
4648
"symfony/dependency-injection": "~3.0|~4.0|~5.0",
4749
"symfony/framework-bundle": "~3.0|~4.0|~5.0",

0 commit comments

Comments
 (0)