在Symfony 3.2中使用每个config.yml的TagAwareAdapter?

时间:2017-02-06 13:57:57

标签: php symfony

我知道我可以像在我的config.yml中那样在Symfony 3.2中定义一个缓存:

    cache:
    default_redis_provider: redis://%redis_password%@%redis_host%:%redis_port%
    pools:
        my_redis_cache:
            adapter: cache.adapter.redis
            public: true
            default_lifetime: 1200
            provider: cache.default_redis_provider

E.g。在我的控制器中我可以简单地使用

$cache = $this->get('my_redis_cache');

现在,从Symfony 3.2开始,我们有了一个名为TagAwareAdapter的奇妙新功能 - 它允许通过标签进行缓存失效。

这是通过以下代码完成的:

$cache = new TagAwareAdapter(
// Adapter for cached items
new FilesystemAdapter(),
// Adapter for tags
new RedisAdapter('redis://localhost')
);

但我可以在config.yml中定义它吗?

我正在寻找类似的东西:

    cache:
    default_redis_provider: redis://%redis_password%@%redis_host%:%redis_port%
    pools:
        my_redis_cache:
            adapter: cache.adapter.redis
            public: true
            default_lifetime: 1200
            provider: cache.default_redis_provider
        my_tag_aware_cache:
            adapter: cache.adapter.tagawareadapter
            provider:
                - my_file_cache
                - my_redis_cache

但我不知道如何定义它 - 我正在玩试试&从现在开始有一段时间的错误 - 到目前为止,我得到的只是错误。

2 个答案:

答案 0 :(得分:4)

上面的答案提供了 解决方案 ,它是一个很好的答案,我只是把它们放在一起作为答案,因为我也浪费了一些时间来了解如何使用TagAwareAdapter。这是我对Symfony 3.4的解决方案。

<强> config.yml

cache:
    pools:
        app.cache.file:
            public: true
            adapter: cache.adapter.filesystem
        app.cache.redis:
            public: true
            adapter: cache.adapter.redis

<强> services.yml

myapp.cache:
    public: true
    class: Symfony\Component\Cache\Adapter\TagAwareAdapter
    arguments: [ '@app.cache.file', '@app.cache.redis' ]

使用它(例如在Controller中):

/** @var TagAwareAdapterInterface $cache */
$cache = $this->get('myapp.cache');

不要忘记安装redis实例并安装redis软件包:

composer require predis/predis

答案 1 :(得分:3)

愚蠢的我。我可以通过在services.yml中定义一个简单的服务来实现:

    my_tag_aware_cache:
        class: Symfony\Component\Cache\Adapter\TagAwareAdapter
        arguments: [ '@my_file_cache', '@my_redis_cache' ]

现在我通过

在控制器中收到缓存
$cache = $this->get('my_tag_aware_cache');

它是TagAware缓存。

还是有其他/更好的方法来实现这个目标吗?