从 Laravel 中的缓存加载 blade 查看文件

Load blade view file from cache in Laravel

我正在尝试将带有参数的整个 blade 视图存储在缓存中以供第一次加载并在下次重新加载时从缓存中加载它。

这是我所做的:

public function cacheAction()
{
    $data = $this->model->getContent();
    Cache::remember('cache-view', 1800, function() {
        dd('load from cache!');
        return view('index')->render();
    });
    dd('not load from cache!');
    return view('index', ['data' => $data]);
    
}

我在加载页面时添加了 2 行调试提示。但是当我访问页面时,它总是显示“未从缓存中加载!”随时。

我该如何解决这个问题?

非常感谢!

您需要使用 remember 函数的 return 值:您将始终到达 dd() 函数,因为 return 语句在 remember 回调函数中。

public function cacheAction()
{
    
    $return = Cache::remember('cache-view', 1800, function() {
        dump('new cache created');
        $data = $this->model->getContent();
        return view('index', ['data' => $data]);
    });
    dd('this will show every time, even if loaded by cache');
    return $return;
    
}

这里正好相反。当您的函数在 remember 回调 运行 中时,它是 而不是 从缓存中加载的。当它不 运行 时,则从缓存中加载它。但是,您实际上并未在此处使用缓存中的结果。以下是您可以利用缓存执行的操作:

public function cacheAction()
{
    $view = Cache::remember('cache-view', 1800, function() {
        $data = $this->model->getContent();
        return view('index', ['data' => $data]);
    });
    return $view;    
}

请注意,您的 cache-view 缓存键实际上并不依赖于 $data 的内容,因此如果 $data 更改,您将获得陈旧的缓存视图。解决方法如下:

public function cacheAction()
{
    $data = $this->model->getContent();
    $cacheKey = md5(serialize($data)); // Make sure data is serializable
    $view = Cache::remember('cache-view-'.$cacheKey, 1800, function() use ($data) {
        return view('index', ['data' => $data]);
    });
    return $view;    
}

然而,这确实有一个缺点,即总是读​​取 $data 来检查缓存是否过时。哪种解决方案适合您取决于您​​的数据是静态的还是动态的。如果您不希望数据频繁更改,那么人们最多看到 1800 秒的陈旧数据可能不是什么大问题