Ларавель запомнил кэш

#php #laravel #caching

Вопрос:

Я пытаюсь запомнить кэш в течение 6 минут на домашней странице, но это ошибки. Мне нужно 10 параметров в одном ключе ( домашняя страница-данные), так что я делаю не так?

 public function index()
{
    $rememberKey = 'homepage-data';
    $minutes = 600;
    Cache::remember($rememberKey, $minutes, function () {

        $breakingNews = BreakingNews::published();
        $rightSlider = Article::rightSlider()->take(20)->get();
        $leftSlider = Article::leftSlider()->take(9)->get();
        $shows = Show::publishedOrderShows()->take(10)->get();
        $blogs = Article::allBlogs()->take(12)->get();
        $latestNews = Article::latestNews()->whereNotIn('id', $rightSlider->pluck('id')->merge($leftSlider->pluck('id')))->take(5)->get();
        $otherNews = Article::otherNews()->whereNotIn('id', $rightSlider->pluck('id')->merge($leftSlider->pluck('id')))->take(2)->get();
        $otherNewsDown = Article::otherNews()->whereNotIn('id', $rightSlider->pluck('id')->merge($leftSlider->pluck('id'))->merge($otherNews->pluck('id')))->take(8)->get();
        $analyticNews = Article::allAnalytics()->take(4)->get();
        $populars = Article::popular()->take(10)->get();
        $quizzes = Quizze::quizOrderBy();

        return view('pages/home-page')->with([
            'breakingNews' => $breakingNews, 'rightSlider' => $rightSlider,
            'leftSlider' => $leftSlider, 'shows' => $shows, 'blogs' => $blogs, 'latestNews' => $latestNews,
            'otherNews' => $otherNews, 'otherNewsDown' => $otherNewsDown, 'analyticNews' => $analyticNews,
            'populars' => $populars, 'quizzes' => $quizzes
        ]);
    });
}
 

Я получаю сериализацию ошибки «Закрытие» недопустимо.

Комментарии:

1. Какие ошибки это дает?

2. Вы нарушаете цель тайника. Он будет выполнять все эти запросы по каждому запросу вместо того, чтобы извлекать их из кэша. Вместо этого запросы должны находиться внутри кэша. Прочитайте о кэшировании Laravel , чтобы узнать, как оно работает, в частности, Извлекать и хранить

3. Я отредактировал код, но я получаю ошибку » Сериализация «Закрытия» недопустима». «ошибка

4. view возвращает запрос , если вы его не используете ->__toString() , так что это не сработает. Конечно, сейчас вы ничего не возвращаете из самой функции.

5. он работает $rememberKey = ‘домашняя страница-данные’; $минут = 600; $rightSlider = Кэш::запомнить($rememberKey, $минут, функция () { вернуть статью::rightSlider()->взять(20)->>получить(); }); но мне нужны все переменные, а не только одна, спасибо за помощь

Ответ №1:

С вашим первоначальным вопросом вы нарушили цель кэша, разместив все ваши запросы за пределами кэша. Теперь у вас слишком много внутри вашего закрытия, и оно пытается сериализовать представление. Переместите представление за пределы кэша, назначьте извлеченный кэш $data , а затем используйте его в качестве массива для отправки обратно в представление.

 public function index()
{
   
    $rememberKey = 'homepage-data';
    $minutes = 600;
    $data = Cache::remember($rememberKey, $minutes, function ()  {
        $breakingNews = BreakingNews::published();
        $rightSlider = Article::rightSlider()->take(20)->get();
        $leftSlider = Article::leftSlider()->take(9)->get();
        $shows = Show::publishedOrderShows()->take(10)->get();
        $blogs = Article::allBlogs()->take(12)->get();
        $latestNews = Article::latestNews()->whereNotIn('id', $rightSlider->pluck('id')->merge($leftSlider->pluck('id')))->take(5)->get();
        $otherNews = Article::otherNews()->whereNotIn('id', $rightSlider->pluck('id')->merge($leftSlider->pluck('id')))->take(2)->get();
        $otherNewsDown = Article::otherNews()->whereNotIn('id', $rightSlider->pluck('id')->merge($leftSlider->pluck('id'))->merge($otherNews->pluck('id')))->take(8)->get();
        $analyticNews = Article::allAnalytics()->take(4)->get();
        $populars = Article::popular()->take(10)->get();
        $quizzes = Quizze::quizOrderBy();

        // CACHE
        return ['breakingNews' => $breakingNews, 
           'rightSlider'=>  $rightSlider, 
            'leftSlider' => $leftSlider, 
            'shows' => $shows, 
            'blogs' => $blogs, 
            'latestNews' => $latestNews, 
            'otherNews' => $otherNews, 
            'otherNewsDown' => $otherNewsDown, 
            'analyticNews' => $analyticNews,
            'populars' => $populars,
            'quizzes' => $quizzes];
       
    });

    return view('pages/home-page')->with([
        'breakingNews' => $data['breakingNews'], 'rightSlider' => $data['rightSlider'],
        'leftSlider' => $data['leftSlider'], 'shows' => $data['shows'], 'blogs' => $data['blogs'], 'latestNews' => $data['latestNews'],
        'otherNews' => $data['otherNews'], 'otherNewsDown' => $data['otherNewsDown'], 'analyticNews' => $data['analyticNews'],
        'populars' => $data['populars'], 'quizzes' => $data['quizzes']
    ]);
}
 

Комментарии:

1. Я получаю сериализацию «ДоктринаDBALДрайверPDOConnection», ошибка недопустима.

2. Все, кроме $quizzes и $breakingNews есть get() на них, так что, вероятно, это одна из этих двух строк.

3. Да, но они должны войти в модель

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

5. Да, я пытаюсь сейчас, но это в строке 66, где это «}); » при обратном просмотре СВЕРХУ допустимо ли, что он закрыт неправильно ?