第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Laravel 緩存與路由模型綁定?

Laravel 緩存與路由模型綁定?

PHP
ITMISS 2022-07-22 19:14:29
我正在向我的 Laravel 應(yīng)用程序路由添加緩存。我有一個(gè)在我的網(wǎng)站上呈現(xiàn)博客文章的功能:    public function show(Post $post)    {        SEO::setTitle($post->title);        SEO::setDescription($post->subtitle);        SEO::setCanonical('https://employbl.com/blog/' . $post->slug);        SEO::opengraph()->setUrl('https://employbl.com/blog/' . $post->slug);        SEO::opengraph()->addProperty('type', 'article');        SEO::opengraph()->addImage($post->featured_image);        SEO::twitter()->setSite('@Employbl_Jobs');        $markdown = Markdown::parse($post->body);        return view('blog.post', compact('post', 'markdown'));    }這是調(diào)用該方法的路由:Route::get('/blog/{post}', 'PostController@show')->name('posts.show');以便我的博客呈現(xiàn)一個(gè)帶有 slug 的 URL,例如:https ://employbl.com/blog/laravel-vue-tailwindcss-single-page-application-spa在此路由上實(shí)現(xiàn)緩存以使用戶更快地加載頁(yè)面的最佳方法是什么?會(huì)不會(huì)是這樣的:$post = Cache::rememberForever('blog-post' . $post->id, function(){     return $post;});或者路由模型綁定是否需要緩存?緩存鍵是否需要唯一,或者我可以只使用“博客文章”作為緩存鍵嗎?$markdown緩存變量而不是變量會(huì)更好$post嗎??jī)蓚€(gè)都?
查看完整描述

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í)間。


查看完整回答
反對(duì) 回復(fù) 2022-07-22
?
米琪卡哇伊

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;

}


查看完整回答
反對(duì) 回復(fù) 2022-07-22
  • 2 回答
  • 0 關(guān)注
  • 172 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)