是否有一种干净的方法来确定当前的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抛出异常错误"行为在未来版本中不会改变。
我是否有一个明显的解决方案?
答案 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安装上,其他版本看起来相同):