如何创建会话支持的 Laravel 缓存存储?

How can I create a session-backed Laravel Cache store?

出于性能原因,我想将一些数据存储在 PHP 会话中而不是我的 Redis 缓存中。

我希望使用 Laravel 缓存外观来执行此操作,但使用某种语法表明我希望在用户会话中保留一份副本 除了到正常的Redis缓存。

然后在检索时,我希望缓存存储首先在会话中查找,只有在找不到时才向 Redis 发出网络请求。

我不是在寻找完整的代码,但我将不胜感激。

None 与 Laravel 捆绑的缓存驱动程序提供了这种双层存储,因此您需要自己实现一个新的驱动程序。幸运的是, 不会太复杂。

首先,创建您的新驱动程序:

class SessionRedisStore extends RedisStore {
  public function get($key) {
    return Session::has($key) ? Session::get($key) : parent::get($key);
  }

  public function put($key, $value, $minutes, $storeInSession = false) {
    if ($storeInSession) Session::set($key, $value);
    return parent::put($key, $value, $minutes);
  }
}

接下来,在您的 AppServiceProvider 中注册新驱动程序:

public function register()
{
  $this->app['cache']->extend('session_redis', function(array $config)
  {
    $redis = $this->app['redis'];
    $connection = array_get($config, 'connection', 'default') ?: 'default';
    return Cache::repository(new RedisStore($redis, $this->getPrefix($config), $connection));
  });
}

在您的 config/cache 中提供配置。php:

'session_redis' => [
  'driver' => 'redis',
  'connection' => 'default',
],

并将缓存驱动程序设置为 config/cache.php.env 文件中的那个驱动程序:

'default' => env('CACHE_DRIVER', 'session_redis'),

请记住,我只更新了 get()put() 方法。您可能需要覆盖更多方法,但这样做应该与 get/put.

一样简单

另一件要记住的事情是,我通过查看 Laravel 代码生成了上面的代码片段,但没有机会对其进行测试 :) 如果您有任何问题,请告诉我我会非常高兴让它工作:)