如何在服务/控制器之间的Symfony中共享Redis Connection / RedisCache?

时间:2019-01-17 10:20:24

标签: symfony redis

我有一些Controller,Twig Extensions和其他需要缓存的类。我正在使用Redis作为缓存。目前,我在每个位置都设置了一个新的RedisCache,如下所示:

public function __construct(LoggerInterface $logger)
{
    $this->logger = $logger;


    $this->cache = new RedisCache(RedisAdapter::createConnection(getenv('REDIS_URL')), 'ImageHelper');
}

但是这会创建许多与Redis后端的连接,我认为这对性能不好。

在我的控制器/扩展/类之间共享RedisConnection /客户端,甚至共享RedisCache,但保持命名空间能力的最佳方法是什么?

我正在使用Symfony 4。

1 个答案:

答案 0 :(得分:1)

您应该使Redis缓存服务,然后将其注入到控制器(或其他依赖项)中。如果需要,请参考Symfony的dependency injection docs

这是一个示例,您可能需要稍后对其进行微调:

# config/services.yaml
services:
    redis_connection:
        class: 'RedisConnection'
        factory: ['RedisAdapter', createConnection]
        arguments: 
          - '%env(REDIS_URL)%'

    redis_cache:
        class: 'RedisCache'
        arguments:
          - '@redis_connection'

请注意,我不知道您的类拥有哪些名称空间,因此您必须相应地调整配置。

然后,您还必须设置框架以将服务注入到控制器(或其他依赖项):

# config/services.yaml
services:
  # ...
  App\Controller\ExampleController:
      arguments:
        - '@logger'
        - '@redis_cache'

此外,您应该更新控制器以接受构造函数中的新参数,如下所示:

public function __construct(LoggerInterface $logger, RedisCache $cache)
{
    $this->logger = $logger;
    $this->cache = $cache;
}

如有任何疑问,请参考service container documentation