我已经使用 RedisAdapter 实现了 Symfony 缓存组件。现在我们喜欢在缓存键中使用冒号作为分隔符(例如 some:cache:key:25)。就像 Redis 推荐的那样。
我收到一个异常消息“包含保留字符 {}()/\@: etc.
”。这在 Symfony 文档中有解释
( https://symfony.com/doc/3.4/components/cache/cache_items.html ) 这些是 PSR-6 中的保留字符。
我想知道是否有解决办法?因为我正忙于使用 Symfony 缓存组件重构缓存逻辑。但是键已经定义好了,所以我无法在不违反约定的情况下更改它们。 😭
最佳答案
如您所述,:
是 PSR-6 缓存标准中的保留字符,Symfony 的缓存组件以此为基础。
如果你想将它们保留在你的代码中,你可以编写一个适配器来获取你的 key 并将 :
替换为其他内容,然后再将其传递到常规缓存。
例如,您可以编写如下所示的适配器:
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 适配器,然后当您将其配置为由缓存组件使用时,它应该可以正常工作,您现有的 key 如 some:cache:key25
将被转换为 some.cache.key25
在它们被传递到缓存组件之前,所以在错误消息发生之前。
关于Symfony 缓存组件 - Redis 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52887092/