0

我已经使用 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 缓存组件重构缓存逻辑。但是键已经定义了,所以我不能在不违反约定的情况下更改它们。

4

1 回答 1

1

正如您所提到:的,是 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'

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

于 2018-10-19T07:55:49.843 回答