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

Php 检测缓存驱动程序是否支持标记,php,caching,laravel,tags,Php,Caching,Laravel,Tags,是否有一种干净的方法来确定当前缓存引擎是否支持Laravel中的标记?我们依赖于一个需要标签支持的开源模块/服务提供商,我想确保我们的系统是防弹的,这样切换缓存引擎不会导致致命错误 现在,如果用户的系统配置了文件或数据库缓存引擎,则以下代码 Cache::tags([]); 抛出错误 照亮\Cache\FileStore没有方法标记 如果用户的系统配置了memcached或redis之类的东西,那么代码可以正常工作 有没有办法干净地检测当前配置的缓存引擎是否支持标记?我能想到的最好的办法就是

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

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

Cache::tags([]);
抛出错误

照亮\Cache\FileStore
没有方法
标记

如果用户的系统配置了memcached或redis之类的东西,那么代码可以正常工作

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

$app = app();
$has_tags = method_exists($app['cache']->driver()->getStore(), 'tags');
但是,这就产生了很多假设,即配置了
缓存
服务,缓存服务用户是“驱动程序”,驱动程序用户是“存储”,并且
标记
方法没有其他用途

我还考虑过在try/catch中包装对
Cache::get
的调用,但是我依赖于Laravel的“抛出PHP错误异常”行为,这种行为在未来的版本中不会改变


有没有一个明显的解决办法我错过了

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

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

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

$stores = collect(config('cache.stores'))
    ->keys()
    ->flatMap(function ($type) {
        return [
            $type => Cache::store($type)->getStore() instanceof Illuminate\Cache\TaggableStore,
        ];
    });
以下是默认缓存存储的答案(在5.2安装中,其他版本似乎相同):

  • apc:对
  • 数组:true
  • 数据库:false
  • 档案:假
  • memcached:对
  • 雷迪斯:没错

而其他答案适用于我使用的内置缓存驱动程序,该驱动程序有一个存储区,不幸的是它没有扩展
TaggableStore

我唯一能让它发挥作用的方法是:

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

原因是(我猜,
TaggableStore
是一个抽象类,而不是一个接口,所以它在某种程度上限制了选项

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

if(Cache::supportsTags()){
//做事
}

供参考:您也可以通过直接调用Cache::getStore()来获取存储,即
方法_存在(Cache::getStore(),'tags')