Laravel кеш с привязкой модели маршрута? - PullRequest
0 голосов
/ 18 января 2020

Я добавляю кеширование в мои Laravel маршруты приложений. У меня есть функция, которая отображает сообщение в блоге на моем сайте:

    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'));
    }

Это маршрут, который вызывает метод: Route::get('/blog/{post}', 'PostController@show')->name('posts.show');, так что мой блог отображает URL со слагом вроде: https://employbl.com/blog/laravel-vue-tailwindcss-single-page-application-spa

Каков наилучший способ реализации кэширования на этом маршруте, чтобы страница загружалась быстрее для пользователей?

Было бы что-то вроде:

$post = Cache::rememberForever('blog-post' . $post->id, function(){
     return $post;
});

Кэширование даже необходимо с привязкой модели маршрута? Ключ кеша должен быть уникальным или я могу просто использовать "запись блога" в качестве ключа кеша? Было бы лучше кэшировать переменную $markdown вместо переменной $post? И

1 Ответ

1 голос
/ 19 января 2020

У вас есть несколько вопросов здесь, поэтому я постараюсь ответить на каждый. Ответы могут быть не идеальными, так как я ухожу из памяти без возможности ссылаться или подтверждать их сам в данный момент.

Если вы пытаетесь кешировать окончательный вывод вашего представления, вы можете эффективно сделать он будет заменять ваш последний просмотр вызов на:

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();
});

Ключ кэша должен быть уникальным для сообщения. Модельная система маршрутизации ничего не знает о кеш-системе, это всего лишь способ передачи значения в контроллер, который делает некоторые предположения о входящих данных на основе URI. Так что то, что вы делаете в настоящее время, это хорошо.

Проблема в том, что ваш вопрос о стоит ли кешировать сообщение, уценку или и то и другое? в том, что это, вероятно, не будет иметь значения

1) Вы вызываете модельный маршрут GET. Это приводит к тому, что каждый раз загружается сообщение из БД, что делает кеширование самого сообщения ненужным. Это верно даже при кэшировании самого представления рендеринга.

2) Ваш вызов view требует самого Post в качестве параметра [of compact () ]. Вам нужно будет загрузить его откуда-то, что означает повторный вызов базы данных для получения сообщения.

3) Вы используете Cache :: запомнитьForever , что означает, что кеш никогда не будет истекают. Поэтому загрузка поста после первого раза будет бессмысленной, поскольку он никогда не будет использоваться снова (результаты сохраняются в кэше навсегда!). Будущие изменения (если они есть) не будут работать, если вы не аннулируете кэш (что делает RememberForever бессмысленным).

Поэтому в этом случае я рекомендую вам отойти от модельный маршрут и вместо этого попробуйте традиционный маршрут на основе идентификатора

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 - время истечения срока действия кэша.

...