【问题标题】:Detect if Cache Driver Supports Tags检测缓存驱动是否支持标签
【发布时间】:2014-09-08 17:52:31
【问题描述】:

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

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

Cache::tags([]);

抛出错误

Illuminate\Cache\FileStore 没有方法tags

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

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

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

但是对于配置了cache 服务、缓存服务用户使用“驱动程序”、驱动程序用户使用“存储”以及@987654328 @ 方法不是为了另一个目的。

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

我是否缺少明显的解决方案?

【问题讨论】:

  • 参考:也可以直接调用Cache::getStore()获取store,即method_exists(Cache::getStore(), 'tags')

标签: php caching laravel tags


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    自 Laravel 8.10 以来就有一种方法:

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

    【讨论】:

      【解决方案3】:

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

      我可以让它工作的唯一方法是:

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

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

      【讨论】:

        【解决方案4】:

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

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

        这些是默认缓存存储的答案(在 5.2 安装中,其他版本似乎相同):

        • apc:真
        • 数组:真
        • 数据库:错误
        • 文件:错误
        • memcached:真
        • redis: 真

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多