Symfony缓存组件-Redis适配器

Symfony缓存组件-Redis适配器,symfony,caching,redis,symfony-cache,Symfony,Caching,Redis,Symfony Cache,我已经使用RedisAdapter实现了Symfony缓存组件。现在我们喜欢在缓存键中使用冒号作为分隔符,例如some:cache:key:25。就像Redis推荐的那样 我得到一个异常,表示包含保留字符{}/\@:等。。Symfony文档对此进行了解释 这些是PSR-6中的保留字符 我想知道有没有办法?因为我正忙于使用Symfony缓存组件重构缓存逻辑。但是键已经定义好了,所以我无法在不打破惯例的情况下更改它们 正如您所注意到的:是PSR-6缓存标准中的保留字符,Symfony的缓存组件就是基

我已经使用RedisAdapter实现了Symfony缓存组件。现在我们喜欢在缓存键中使用冒号作为分隔符,例如some:cache:key:25。就像Redis推荐的那样

我得到一个异常,表示包含保留字符{}/\@:等。。Symfony文档对此进行了解释

这些是PSR-6中的保留字符

我想知道有没有办法?因为我正忙于使用Symfony缓存组件重构缓存逻辑。但是键已经定义好了,所以我无法在不打破惯例的情况下更改它们 正如您所注意到的:是PSR-6缓存标准中的保留字符,Symfony的缓存组件就是基于该标准构建的

如果希望将它们保留在代码中,可以编写一个适配器,在将其传递到常规缓存之前,该适配器接受密钥并用其他内容替换:

例如,您可以编写一个如下所示的适配器:

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'
对于所有其他方法,您只需代理对修饰服务的调用并返回结果。写起来有点烦人,但接口需要它

在您的服务配置中,您可以如下配置:

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'

这个配置只是一个粗略的轮廓,参数和类名都可能需要调整。在任何情况下,您的适配器都会围绕原始的redis适配器,然后当您将其配置为缓存组件使用时,它应该可以正常工作,您的现有密钥(如some:cache:key25)将在传递到缓存组件之前转换为some.cache.key25,因此,在错误信息出现之前。

您能分享完整准确的错误信息吗?请继续阅读。它有一个bug标签。我喜欢这种方法。谢谢。问题是,我所在的地方的人喜欢在键中使用冒号,这样redis客户端才能正常工作,例如,将redis值列为目录文件夹。但是,也许我必须与我的团队进一步讨论。在这种情况下,如果您还想在redis中保留冒号,那么您必须编写自己的适配器,该适配器不扩展AbstractAdapter,并且忽略验证检查。如果查看AbstractAdapter,您应该看到异常抛出的位置,然后替换用于执行检查的闭包。可能缓存组件中的其他位置也需要为此进行调整。