我已经使用RedisAdapter实现了Symfony缓存组件。现在我们想在冒充键中使用冒号作为分隔符(例如some:cache:key:25)。就像Redis推荐的那样。
我得到一个异常,说“ contains reserved characters {}()/\@: etc.
”。 Symfony文档中对此进行了解释
(https://symfony.com/doc/3.4/components/cache/cache_items.html)这些是PSR-6中的保留字符。
我想知道是否有办法解决?因为我正在忙于使用Symfony缓存组件来重构缓存逻辑。但是键已经定义,所以我不能在不违反约定的情况下对其进行更改。
答案 0 :(得分:0)
正如您所指出的,:
是Symfony的缓存组件所建立的PSR-6缓存标准中的保留字符。
如果您希望将它们保留在代码中,则可以编写一个适配器,该适配器会使用您的密钥并将:
替换为其他内容,然后再将其传递给常规缓存。
例如,您可以编写一个看起来像这样的适配器:
class MyCacheAdapter implements AdapterInterface
{
private $decoratedAdapter;
public function __construct(AdapterInterface $adapter)
{
$this->decoratedAdapter = $adapter;
}
public function getItem($key): CacheItemInterface
{
$key = str_replace(':', '.', $key);
return $this->decoratedAdapter->getItem($key);
}
...
}
对于所有其他方法,您只需将调用代理到经过修饰的服务并返回结果即可。编写代码有点烦人,但是接口要求这样做。
在服务配置中,您可以像这样配置它:
services:
App\Cache\MyCacheAdapter:
decorates: 'Symfony\Component\Cache\Adapter\RedisAdapter'
arguments:
$adapter: '@app.cache.adapter.redis'
此配置只是参数的粗略概述,可能必须调整类名称。在任何情况下,使用此service decoration时,您的适配器都会缠绕原始的redis适配器,然后在将其配置为由缓存组件使用时,它应该可以正常工作,将现有的键(例如some:cache:key25
)转换为some.cache.key25
之前,它们被传递到缓存组件中,因此在错误消息发生之前。