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

Ala*_*orm 6 php tags caching laravel

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

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

Cache::tags([]);
Run Code Online (Sandbox Code Playgroud)

抛出错误

Illuminate\Cache\FileStore 没有方法 tags

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

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

$app = app();
$has_tags = method_exists($app['cache']->driver()->getStore(), 'tags');
Run Code Online (Sandbox Code Playgroud)

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

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

有一个明显的解决方案我错过了吗?

Har*_*air 11

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

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


Epo*_*poc 7

从 Laravel 8.10 开始有一个方法:

if (Cache::supportsTags()) {
    // Do things
}
Run Code Online (Sandbox Code Playgroud)