gpt4 book ai didi

php - 根据环境 Autowiring symfony CacheInterface

转载 作者:行者123 更新时间:2023-12-02 10:52:54 28 4
gpt4 key购买 nike

我正在尝试在我的环境中使用不同的缓存系统。例如,我希望为dev使用Filesystem,为prod使用memcached

我正在使用symfony 3.3.10

为了实现这一点,我想 Autowiring CacheInterface,如下所示:

use Psr\SimpleCache\CacheInterface;

class Api {

public function __construct(CacheInterface $cache)
{
$this->cache = $cache;
}
}

这是我的配置文件:

config_dev.yml:

framework:
cache:
app: cache.adapter.filesystem

config_prod.yml:

framework:
cache:
app: cache.adapter.memcached
...

这是我得到的错误: enter image description here

FilesystemCache声明为服务时,错误消失:

services:
Symfony\Component\Cache\Simple\FilesystemCache: ~

但现在我无法为测试环境提供另一个缓存系统,例如NullCache。事实上,我只需声明一项从 CacheInterface 继承的服务。这是不可能的,因为 config_test 也在使用 config_dev

这是 services.yml 的开头(如果有帮助的话):

services:
_defaults:
autowire: true
autoconfigure: true
public: false

知道如何根据环境 Autowiring 不同的缓存系统吗?

编辑:

这是工作配置:

use Psr\Cache\CacheItemPoolInterface;

class MyApi
{
/**
* @var CacheItemPoolInterface
*/
private $cache;

public function __construct(CacheItemPoolInterface $cache)
{
$this->cache = $cache;
}
}

config.yml:

framework:
# ...
cache:
pools:
app.cache.api:
default_lifetime: 3600

services.yml:

# ...
Psr\Cache\CacheItemPoolInterface:
alias: 'app.cache.api'

最佳答案

尽管工厂模式是解决此类问题的一个不错的选择,但通常您不需要为 Symfony 缓存系统这样做。输入提示改为 CacheItemPoolInterface:

use Psr\Cache\CacheItemPoolInterface;

public function __construct(CacheItemPoolInterface $cache)

它会根据事件环境自动注入(inject)当前的 cache.app 服务,因此 Symfony 会为您完成这项工作!

只需确保为每个环境配置文件配置framework.cache.app:

# app/config/config_test.yml
imports:
- { resource: config_dev.yml }

framework:
#...
cache:
app: cache.adapter.null

services:
cache.adapter.null:
class: Symfony\Component\Cache\Adapter\NullAdapter
arguments: [~] # small trick to avoid arguments errors on compile-time.

由于 cache.adapter.null 服务默认不可用,您可能需要手动定义它。

关于php - 根据环境 Autowiring symfony CacheInterface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46893809/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com