2 回答
TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
你在這里有幾個(gè)問(wèn)題,所以我會(huì)盡力回答每個(gè)問(wèn)題。答案可能不是完美的,因?yàn)槲椰F(xiàn)在沒(méi)有任何方式參考或確認(rèn)自己的記憶。
如果您嘗試緩存視圖的最終輸出,則可以有效地將最終視圖調(diào)用替換為:
return Cache::rememberForever('blog-post' . $post->id, function() use ($post) {
// Do your SEO and markdown stuff here
return view('blog.post', compact('post', 'markdown'))->render();
});
緩存鍵對(duì)于帖子必須是唯一的。模型路由系統(tǒng)對(duì)緩存系統(tǒng)一無(wú)所知,它只是將值傳遞給控制器的一種方式,控制器根據(jù) URI 對(duì)傳入數(shù)據(jù)進(jìn)行一些假設(shè)。所以你現(xiàn)在做的很好。
你的問(wèn)題是我應(yīng)該緩存帖子、降價(jià)還是兩者兼而有之?是它可能不會(huì)有所作為
1)您正在調(diào)用模型 GET 路由。這具有每次從數(shù)據(jù)庫(kù)加載 Post 的效果,使 Post 本身的緩存無(wú)關(guān)緊要。即使渲染視圖本身的緩存也是如此。
2) 您的視圖調(diào)用需要 Post 本身作為參數(shù) [of compact() ]。您需要從某個(gè)地方加載它,這意味著再次調(diào)用數(shù)據(jù)庫(kù)來(lái)檢索帖子。
3)您正在使用Cache::rememberForever這意味著緩存永遠(yuǎn)不會(huì)過(guò)期。所以在第一次之后加載 Post 是沒(méi)有意義的,因?yàn)樗肋h(yuǎn)不會(huì)被再次使用(結(jié)果會(huì)被永久緩存!)。除非您使緩存無(wú)效(這使rememberForever變得毫無(wú)意義) ,否則未來(lái)的編輯(如果有的話)將不起作用。
因此,對(duì)于這種情況,我建議您遠(yuǎn)離模型路線,而是嘗試使用傳統(tǒng)的基于 id 的路線
public function show(Request $request, $id)
{
return Cache::remember('blog-post'.$id, ttl, function() use($id) {
$post = Post::find($id);
// Do SEO and markdown stuff
return view('blog.post', compact('post', 'markdown'))->render();
});
}
其中ttl是緩存過(guò)期的時(shí)間。
TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊
我正在尋求解決使用路由模型綁定綁定的緩存模型的類似問(wèn)題,并找到了以下解決方案。
// On the Model class add the following method.
public function resolveRouteBinding($value, $field = null): ?Model
{
return Cache::remember('my.custom.key'.$value, 3600, function () use ($value) {
return $this->where('slug', $value)->firstOrFail();
});
}
可以在此處找到方法詳細(xì)信息:自定義解析邏輯
值得注意的是,您很有可能寧愿在沒(méi)有該Cache::remember()方法的情況下使用它,這樣您就不會(huì)緩存返回 null 的內(nèi)容。最好通過(guò)以下方式執(zhí)行此操作:
// On the Model class add the following method.
public function resolveRouteBinding($value, $field = null): ?Model
{
$cacheName = "my.custom.key.{$value}";
if (Cache::has($cacheName)) {
return Cache::get($cacheName);
}
$result = $this->query('slug', $value)->firstOrFail();
Cache::put($cacheName, $result, 3600);
return $result;
}
- 2 回答
- 0 關(guān)注
- 172 瀏覽
添加回答
舉報(bào)
