检测缓存驱动程序是否支持标记

时间:2014-09-08 17:52:32

标签: php caching laravel tags

是否有一种干净的方法来确定当前的Cache引擎是否支持Laravel中的tags?我们依赖于需要tags支持的开源模块/ ServiceProvider,我想确保我们的系统是防弹的,这样切换缓存引擎不会导致致命错误。

现在,如果用户的系统配置了文件或数据库缓存引擎,则使用以下代码

Cache::tags([]);

抛出错误

  

Illuminate\Cache\FileStore没有方法tags

如果用户的系统配置了memcached或redis等,则代码可以正常运行。

有没有办法干净地检测当前配置的缓存引擎是否支持标记?我能想出的最好的是

$app = app();
$has_tags = method_exists($app['cache']->driver()->getStore(), 'tags');

但是,如果配置了cache服务,并且缓存服务使用"驱动程序",那就是驱动程序,那就是w / r / t做了很多假设用户a"存储",并且tags方法不存在其他目的。

我还考虑过在try / catch中包含对Cache::get的调用,但后来我依赖Laravel"为PHP抛出异常错误"行为在未来版本中不会改变。

我是否有一个明显的解决方案?

4 个答案:

答案 0 :(得分:9)

我知道这是一个老问题,但对于到达这里的其他人来说,正确的答案是:

if(Cache::getStore() instanceof \Illuminate\Cache\TaggableStore;) {
    // We have a taggable cache.
}

答案 1 :(得分:1)

从 Laravel 8.10 开始就有一种方法:

if (Cache::supportsTags()) {
    // Do things
}

答案 2 :(得分:0)

虽然其他答案对内置缓存驱动程序有效,但我使用过a tagged file cache driver,但是不幸的是,该商店的存储没有扩展TaggableStore

我唯一能使它起作用的方法是:

 if (method_exists(Cache::store($type)->getStore(), 'tags')) {
    // Supports tags
 }

原因是(我猜)TaggableStore是一个抽象类而不是一个接口,因此它限制了选项。

答案 3 :(得分:-1)

如果您想生成支持标记的商店列表,请使用以下命令:

$stores = collect(config('cache.stores'))
    ->keys()
    ->flatMap(function ($type) {
        return [
            $type => Cache::store($type)->getStore() instanceof Illuminate\Cache\TaggableStore,
        ];
    });

这些是默认缓存存储的答案(在5.2安装上,其他版本看起来相同):

  • apc:true
  • array:true
  • database:false
  • file:false
  • memcached:true
  • redis:true